12.5Swing控件3Jpanel JOptionPane
JPanel
JPanel
是一个轻量级容器组件,用于组织和管理其他 GUI 组件。它继承自JComponent
类,属于javax.swing
包,可以容纳按钮、文本框、标签等控件 JPanel
默认使用的布局管理器是 FlowLayout
,也可以嵌套其他面板,以便将它们组合在一起并作为一个整体来布局。帮助开发者创建复杂的界面布局。
1. JPanel 的基本特点
- 轻量级容器:不自带标题栏或边框,需通过
setBorder()
方法添加。 - 透明性:默认背景透明,但可通过
setOpaque(true)
设置为不透明。 - 布局管理:需指定布局管理器(如
FlowLayout
、BorderLayout
、GridLayout
等)。
2. 常用构造方法
JPanel()
:创建默认使用FlowLayout
的面板。JPanel(LayoutManager layout)
:创建指定布局管理器的面板。
3. 核心方法
方法 | 描述 |
---|---|
add(Component comp) | 添加组件到面板。 |
setLayout(LayoutManager) | 设置面板的布局管理器。 |
setBackground(Color) | 设置面板背景色。 |
setBorder(Border) | 设置面板边框(如LineBorder )。 |
setOpaque(boolean) | 设置面板是否透明。 |
4. 布局管理器示例
以下代码展示了JPanel
结合不同布局管理器的用法:
import javax.swing.*;
import java.awt.*;public class JPanelExample {public static void main(String[] args) {// 创建JFrame窗口JFrame frame = new JFrame("JPanel示例");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(600, 400);// 1. FlowLayout面板(默认布局)JPanel flowPanel = new JPanel();flowPanel.setBorder(BorderFactory.createTitledBorder("FlowLayout"));for (int i = 1; i <= 5; i++) {flowPanel.add(new JButton("按钮" + i));}// 2. BorderLayout面板JPanel borderPanel = new JPanel(new BorderLayout());borderPanel.setBorder(BorderFactory.createTitledBorder("BorderLayout"));borderPanel.add(new JButton("北"), BorderLayout.NORTH);borderPanel.add(new JButton("南"), BorderLayout.SOUTH);borderPanel.add(new JButton("西"), BorderLayout.WEST);borderPanel.add(new JButton("东"), BorderLayout.EAST);borderPanel.add(new JButton("中"), BorderLayout.CENTER);// 3. GridLayout面板JPanel gridPanel = new JPanel(new GridLayout(2, 3));gridPanel.setBorder(BorderFactory.createTitledBorder("GridLayout (2x3)"));for (int i = 1; i <= 6; i++) {gridPanel.add(new JButton("网格" + i));}// 主面板:使用BoxLayout垂直排列三个子面板JPanel mainPanel = new JPanel();mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));mainPanel.add(flowPanel);mainPanel.add(Box.createVerticalStrut(10)); // 添加间距mainPanel.add(borderPanel);mainPanel.add(Box.createVerticalStrut(10));mainPanel.add(gridPanel);// 将主面板添加到窗口frame.add(mainPanel);frame.setVisible(true);}
}
5. 嵌套面板示例
通过嵌套面板,可以创建复杂的界面结构。以下是一个计算器布局示例:
import javax.swing.*;
import java.awt.*;public class CalculatorExample {public static void main(String[] args) {JFrame frame = new JFrame("计算器");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(300, 400);// 主面板:BorderLayoutJPanel mainPanel = new JPanel(new BorderLayout());// 顶部面板:显示框JTextField display = new JTextField();display.setEditable(false);display.setFont(new Font("Arial", Font.PLAIN, 24));mainPanel.add(display, BorderLayout.NORTH);// 中间面板:数字按钮(使用GridLayout)JPanel buttonPanel = new JPanel(new GridLayout(4, 4, 5, 5));String[] buttons = {"7", "8", "9", "/","4", "5", "6", "*","1", "2", "3", "-","0", ".", "=", "+"};for (String text : buttons) {buttonPanel.add(new JButton(text));}mainPanel.add(buttonPanel, BorderLayout.CENTER);frame.add(mainPanel);frame.setVisible(true);}
}
6. 自定义绘制
通过继承JPanel
并重写paintComponent(Graphics)
方法,可以实现自定义绘图:
import javax.swing.*;
import java.awt.*;public class CustomPanelExample {public static void main(String[] args) {JFrame frame = new JFrame("自定义面板");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(400, 300);// 创建自定义面板JPanel customPanel = new JPanel() {@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);// 绘制矩形g.setColor(Color.RED);g.fillRect(50, 50, 100, 100);// 绘制椭圆g.setColor(Color.BLUE);g.fillOval(200, 50, 100, 100);// 绘制文本g.setColor(Color.BLACK);g.setFont(new Font("Arial", Font.BOLD, 20));g.drawString("自定义绘图", 150, 200);}};customPanel.setOpaque(true);customPanel.setBackground(Color.WHITE);frame.add(customPanel);frame.setVisible(true);}
}
7. 注意事项
- 线程安全:Swing 不是线程安全的,所有 GUI 操作应在事件调度线程(EDT)中执行。可使用
SwingUtilities.invokeLater()
确保线程安全。 - 布局管理:合理选择布局管理器,避免手动设置组件大小和位置。
- 重绘机制:调用
repaint()
方法触发paintComponent()
重绘面板。
JPanel
是 Swing 中组织界面的核心组件,通过灵活搭配布局管理器和嵌套结构,可以构建出各种复杂的 GUI 界面。掌握JPanel
的使用是 Java GUI 开发的基础。
JOptionPane
1. JOptionPane
提供了一种简单的方式来弹出标准对话框,如消息框、确认对话框、输入对话框等。它是实现与用户进行简单交互的一种便捷方式。
JOptionPane
提供了五种预定义的对话框类型:
- 消息对话框:显示信息,如操作成功提示。
- 确认对话框:询问用户确认操作,如 “是否保存?”。
- 输入对话框:获取用户输入的文本。
- 选项对话框:提供多个选项供用户选择。
- 文件选择对话框:虽然属于
JFileChooser
,但常与JOptionPane
配合使用。
2. 常用静态方法
方法 | 描述 |
---|---|
showMessageDialog(Component parent, Object message) | 显示消息对话框 |
showConfirmDialog(Component parent, Object message) | 显示确认对话框(返回用户选择的按钮值) |
showInputDialog(Component parent, Object message) | 显示输入对话框(返回用户输入的文本) |
showOptionDialog(Component parent, Object message, String title, int optionType, int messageType, Icon icon, Object[] options, Object initialValue) | 自定义选项对话框 |
3. 参数说明
- parentComponent:对话框的父组件,用于定位。若为
null
,对话框居中显示。 - message:对话框中显示的内容(可以是字符串、组件或图标)。
- title:对话框标题。
- optionType:确认对话框的按钮类型(如
YES_NO_OPTION
、YES_NO_CANCEL_OPTION
)。 - messageType:消息类型(如
ERROR_MESSAGE
、INFORMATION_MESSAGE
),影响图标显示。 - icon:自定义图标。
- options:自定义选项数组。
4. 消息对话框示例
import javax.swing.JOptionPane;public class MessageDialogExample {public static void main(String[] args) {// 基本消息对话框JOptionPane.showMessageDialog(null, "操作成功!", "提示", JOptionPane.INFORMATION_MESSAGE);// 错误消息对话框JOptionPane.showMessageDialog(null, "文件不存在!", "错误", JOptionPane.ERROR_MESSAGE);// 警告消息对话框JOptionPane.showMessageDialog(null, "磁盘空间不足!", "警告", JOptionPane.WARNING_MESSAGE);}
}
5. 确认对话框示例
import javax.swing.JOptionPane;public class ConfirmDialogExample {public static void main(String[] args) {// 标准确认对话框(Yes/No/Cancel)int choice = JOptionPane.showConfirmDialog(null, "是否保存更改?", "确认", JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);// 处理用户选择switch (choice) {case JOptionPane.YES_OPTION:System.out.println("用户选择了Yes");break;case JOptionPane.NO_OPTION:System.out.println("用户选择了No");break;case JOptionPane.CANCEL_OPTION:case JOptionPane.CLOSED_OPTION:System.out.println("操作取消");break;}}
}
6. 输入对话框示例
import javax.swing.JOptionPane;public class InputDialogExample {public static void main(String[] args) {// 基本文本输入String name = JOptionPane.showInputDialog(null, "请输入您的姓名:", "用户信息", JOptionPane.PLAIN_MESSAGE);if (name != null && !name.isEmpty()) {JOptionPane.showMessageDialog(null, "欢迎," + name + "!", "问候", JOptionPane.INFORMATION_MESSAGE);} else {JOptionPane.showMessageDialog(null, "输入为空或已取消", "提示", JOptionPane.WARNING_MESSAGE);}// 自定义选项输入Object[] options = {"红色", "绿色", "蓝色"};Object color = JOptionPane.showInputDialog(null, "选择喜欢的颜色:", "颜色选择", JOptionPane.QUESTION_MESSAGE, null, options, options[0]);if (color != null) {JOptionPane.showMessageDialog(null, "您选择了:" + color, "结果", JOptionPane.INFORMATION_MESSAGE);}}
}
7. 自定义选项对话框示例
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;public class OptionDialogExample {public static void main(String[] args) {// 自定义图标Icon icon = new ImageIcon("path/to/icon.png"); // 替换为实际图标路径// 自定义选项Object[] options = {"确定", "取消", "帮助"};// 自定义选项对话框int selectedOption = JOptionPane.showOptionDialog(null, "请选择操作:", "自定义对话框", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, icon, options, options[0]);// 处理结果if (selectedOption >= 0) {JOptionPane.showMessageDialog(null, "您选择了:" + options[selectedOption], "结果", JOptionPane.INFORMATION_MESSAGE);}}
}