已完成遊戲主介面骨架:系統選單、遊戲區、使用者互動區。本節進行「精裝修」:打造專業級對話框、掌握模態/非模態視窗、在元件上使用 HTML 標籤豐富顯示效果。
JOptionPane 適合簡單訊息,但長文本、複雜佈局、自訂元件時力不從心。JDialog 與 JFrame 同屬頂層容器,用法近似 JPanel,支援完整佈局管理器。
public class AboutDialog extends JDialog {
JLabel about = new JLabel("關於:這可是 Java 寫的連連看哦!");
public AboutDialog(JFrame owner) {
super(owner, "About", true); // 模態對話框
setSize(320, 200);
setLocationRelativeTo(owner); // 相對父視窗置中
about.setHorizontalAlignment(SwingConstants.CENTER);
getContentPane().add(about, BorderLayout.CENTER);
// 關閉按鈕(使用 Java 外觀時右上角 X 會隱藏)
JButton closeBtn = new JButton("關閉");
closeBtn.addActionListener(e -> dispose());
JPanel btnPanel = new JPanel();
btnPanel.add(closeBtn);
getContentPane().add(btnPanel, BorderLayout.SOUTH);
setVisible(true);
}
}
if (e.getSource() == aboutMenuItem) {
new AboutDialog(mainFrame);
return;
}
// 啟用 Java 觀感裝飾(更美觀,但原生標題列消失)
JDialog.setDefaultLookAndFeelDecorated(true);
代價: 原生關閉按鈕消失,必須自行添加「關閉」按鈕與事件處理。
| 類型 | 行為 | 典型範例 | 構造方式 |
|---|---|---|---|
| 模態 | 阻塞父視窗交互,必須關閉才能操作其他視窗 | 字體設定、關鍵確認對話框 | new JDialog(owner, true) 或 setModal(true) |
| 非模態 | 不阻塞父視窗,可同時操作多個視窗 | 尋找/替換對話框、工具面板 | new JDialog(owner, false) 或 setModal(false) |
Windows 記事本:「字體」= 模態,「尋找」= 非模態。
絕大多數 Swing 元件(JLabel、JButton、JTabbedPane 標籤、JToolTip、JTable 儲存格等)支援 HTML 3.2 子集渲染:
<b>、<i>、<u>、<font color="red" size="+2"><p>、<br>、<center><ul><li>、<ol><li><table><tr><td>(簡易)<img src="...">(需實現 ImageIcon 載入)JLabel richLabel = new JLabel(
"" +
"遊戲規則
" +
"" +
"- 使用方向鍵移動
" +
"- 吃到食物加分
" +
"- 撞牆或撞到自己遊戲結束
" +
"
" +
"祝您遊戲愉快! " +
""
);
richLabel.setHorizontalAlignment(SwingConstants.CENTER);
<html> 開頭啟用 HTML 渲染引擎。<video>、<canvas> 等)。JDialog 替代 JOptionPane 實現專業級對話框。setDefaultLookAndFeelDecorated(true) 提升視覺質感,代價是需自行實現關閉按鈕。善用 Graphics 繪製圖形、實現遊戲動畫核心迴圈、雙緩衝技術消除閃爍。