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);}}
}