右键菜单
右键菜单,JPopupMenu,即弹出式菜单、上下文菜单
右键点击某个控件,根据上下文弹出一个菜单。
创建顺序:
- 创建 JPopupMenu
- 添加 JMenuItem
- 添加鼠标右键的响应,显示菜单窗口
- 菜单项被点击时,执行事件处理。
代码:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
public class Demo {
public static void main(String[] args) {
MyFrame frame = new MyFrame("Title");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(700, 700);
frame.setLocation(500, 300);
frame.setVisible(true);
}
}
class MyFrame extends JFrame{
JPopupMenu popup = new JPopupMenu();
public MyFrame(String title) {
super(title);
//ContentPane
JPanel root = new JPanel();
this.setContentPane(root);
root.setLayout(new BorderLayout());
//右键菜单
popup.add(createMenuItem("打开", "fileOpen", "./src/images/buhaoyisi.png"));
popup.add(createMenuItem("保存", "fileSave", "./src/images/ganga.png"));
popup.add(createMenuItem("另存为", "fileSaveAs", "./src/images/gaoxing.png"));
popup.add(createMenuItem("帮助", "fileHelp", "./src/images/hanxiao.png"));
//添加右键点击事件响应,点击右键时,弹出菜单
root.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON3) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
});
}
private JMenuItem createMenuItem(String text, String action, String iconName) {
JMenuItem item = new JMenuItem(text);
item.setActionCommand(action);
item.addActionListener(actionListener);
if(iconName != null) {
item.setIcon(new ImageIcon(iconName));
}
return item;
}
private ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String action = e.getActionCommand();
System.out.println("执行命令" + action);
if(action.equals("fileOpen")) {
JOptionPane.showMessageDialog(MyFrame.this, action);
}
}
};
}
显示(在该位置右键后):
对话框
对话框 Dialog
程序与用户之间对话的界面,获取用户输入的手段
消息提示框:使用 JOptionPane 提供的工具方法,可以方便地显示一些简单的对话框
showMessageDialog(); //简单消息提示
showConfirmDialog(); //简单消息确认
showInputDialog(); //简单数据输入
showOptionDialog(); //简单选择输入
代码:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Demo {
public static void main(String[] args) {
MyFrame frame = new MyFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(700, 700);
frame.setLocation(300, 300);
frame.setVisible(true);
}
}
class MyFrame extends JFrame{
public MyFrame(String title) {
super(title);
JPanel root = new JPanel();
this.setContentPane(root);
root.setLayout(new FlowLayout());
JTextField textField = new JTextField(20);
JButton button = new JButton("测试");
root.add(textField);
root.add(button);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
test4();
}
});
}
//简单消息提示框
public void test1() {
JOptionPane.showMessageDialog(this, "操作已经完成");
System.out.println("test1 exit");
}
//简单消息确认提示框
public void test2() {
int select = JOptionPane.showConfirmDialog(this, "是否确认删除?", "确认", JOptionPane.YES_NO_OPTION);
//select 为用户点击的第几个按钮
if(select == 0) {
System.out.println("模拟执行数据删除操作...");
System.out.println("删除完成");
}
System.out.println("test2 exit");
}
//简单数据输入框
public void test3() {
String input = JOptionPane.showInputDialog(
this,
"请输入你的身份证号\n(字母以X代替)",
"0000");
if(input != null) {
System.out.println("输入的号码为: " + input);
}
System.out.println("test3 exit");
}
//简单选项对话框
private void test4() {
Object[] colors = {"红色", "蓝色", "绿色"};
String select = (String)JOptionPane.showInputDialog(
this,
"你最喜欢的颜色",
"请选择",
JOptionPane.PLAIN_MESSAGE,
null,
colors,
"红色");
if(select != null) {
System.out.println("选择了" + select);
}
System.out.println("test4 exit");
}
}
显示:
对话框的阻塞
对话框最大的特点:阻塞 Blocked
- 当对话框显示时,后台界面被阻塞
- 调用方法阻塞,直到对话框被关闭
内部是通过无限循环实现的,直到用户的输入关闭了对话框。