Swing編程中可通過繼承JDialog自定義對話框。下面給出一個完整的「關於本程序」對話框實現,包含圖片展示、作者信息、系統屬性顯示、帶圖標狀態切換的確定按鈕等常見元素。
class HelpAbout extends JDialog implements ActionListener {
JavaWord mainFrame;
JButton okButton;
javax.swing.Timer myTimer;
int Counter = 0;
public HelpAbout(JavaWord mainFrame) {
super(mainFrame, "關於本程序的說明", true); // true = 模態
this.mainFrame = mainFrame;
// 主面板:BorderLayout
JPanel contentPanel = new JPanel(new BorderLayout());
// 西側:Logo圖片
JLabel imageLabel = new JLabel(new ImageIcon(".images/javaLogo.gif"));
contentPanel.add(imageLabel, BorderLayout.WEST);
// 北側:作者信息
JPanel authorInfoPane = new JPanel(new GridLayout(1, 1));
JTextArea aboutContent = new JTextArea(
"本程序是作者在學習Java 2 Swing編程的一個簡單程序,並不作商業用途。\n作者聯系方式:"
);
aboutContent.setEnabled(false); // 僅顯示
authorInfoPane.add(aboutContent);
contentPanel.add(authorInfoPane, BorderLayout.NORTH);
// 中央:系統信息(5行網格)
JPanel sysInfoPane = new JPanel(new GridLayout(5, 1));
sysInfoPane.setBorder(BorderFactory.createLoweredBevelBorder());
contentPanel.add(sysInfoPane, BorderLayout.CENTER);
sysInfoPane.add(new JLabel("本機用戶名:" + System.getProperty("user.name")));
sysInfoPane.add(new JLabel("操作系統:" + System.getProperty("os.name")));
sysInfoPane.add(new JLabel("Java SDK版本:" + System.getProperty("java.version")));
sysInfoPane.add(new JLabel("JVM總內存:" + Runtime.getRuntime().totalMemory() + " 字節"));
sysInfoPane.add(new JLabel("JVM剩餘內存:" + Runtime.getRuntime().freeMemory() + " 字節"));
// 南側:確定按鈕面板
JPanel okPane = new JPanel();
okButton = new JButton("確定(O)", new ImageIcon(".images/ok.gif"));
okButton.setMnemonic('O'); // Alt+O 快捷鍵
// 按鈕圖標狀態:離開、懸停、按下
Icon general = new ImageIcon(".images/ok.gif");
Icon rollover = new ImageIcon(".images/exit.gif");
Icon pressed = new ImageIcon(".images/help.gif");
okButton.setRolloverEnabled(true);
okButton.setIcon(general);
okButton.setRolloverIcon(rollover);
okButton.setPressedIcon(pressed);
// 設為對話框默認按鈕(回車觸發)
this.getRootPane().setDefaultButton(okButton);
okButton.addActionListener(this);
okPane.add(okButton);
contentPanel.add(okPane, BorderLayout.SOUTH);
setContentPane(contentPanel);
// setResizable(false); // 可選:固定大小
pack(); // 自適應大小
setLocationRelativeTo(mainFrame); // 居中顯示
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == okButton) {
dispose(); // 關閉對話框
}
}
}
true,阻塞父窗口交互直到關閉。System.getProperty()與Runtime.getRuntime()動態顯示運行環境信息。setRolloverIcon()、setPressedIcon()實現豐富視覺反饋。getRootPane().setDefaultButton()綁定回車鍵觸發。此範例展示了Swing構建專業級對話框的標準模式,可直接擴展為項目通用的對話框基類。