Dialog 類別,擁有版面配置管理器 (預設 BorderLayout)WINDOW_DESTROY 事件應呼叫 dispose() 釋放資源,而非 System.exit() 結束整個應用程式// ToeTest.java 核心結構
class ToeButton extends Canvas {
int state = ToeDialog.BLANK;
ToeDialog parent; // 持有父對話框參考
ToeButton(ToeDialog parent) { this.parent = parent; }
public void paint(Graphics g) { ... 畫格子、X、O ... }
public boolean mouseDown(Event evt, int x, int y) {
if (state == BLANK) state = parent.turn;
else state = (state == XX ? OO : XX);
parent.turn = (parent.turn == XX ? OO : XX);
repaint(); return true;
}
}
class ToeDialog extends Dialog {
static final int BLANK=0, XX=1, OO=2;
int turn = XX;
public ToeDialog(Frame parent, int w, int h) {
super(parent, "The game itself", false); // false = 非模態
setLayout(new GridLayout(w, h));
for (int i=0; i
ToeButton 持有 ToeDialog 參考存取 turn,形成緊密耦合。替代方案:turn 設為 static,但會限制同時只能有一個遊戲實例正常運行。教學中為簡化邏輯接受耦合,實務中應透過介面/事件總線解耦。
paint() 計算幾何座標繪製格子與 X/O,純手工繪圖,現代開發建議使用 Swing JButton + Icon 或 JavaFX Button + Graphic 替代。
Java 1.0 模型:覆寫 mouseDown()、handleEvent()。Java 1.1+ 應改用 MouseListener/MouseAdapter。
super(parent, title, true); // 模態:阻塞父視窗輸入,show() 才返回
super(parent, title, false); // 非模態:雙視窗並行運作
範例使用非模態,允許主視窗操作時對話框開啟。
FileDialog 封裝作業系統原生開啟/儲存對話框,Applet 受沙箱限制無法使用。
FileDialog d = new FileDialog(this, "What file do you want to open?");
d.setFile("*.java"); // 檔名過濾 (支援萬用字元視作業系統)
d.setDirectory("."); // 起始目錄
d.show(); // 阻塞直到關閉
String file = d.getFile();
if (file != null) { /* 使用者選擇檔案 */ }
else { /* 使用者取消 */ }
FileDialog d = new FileDialog(this, "Save as?", FileDialog.SAVE);
// 其他相同
| 技術 | 核心類別 | 優勢 |
|---|---|---|
| Swing | JDialog, JFileChooser, JOptionPane | 跨平台一致外觀、豐富元件、可嵌入任意元件、支援預覽/過濾器 |
| JavaFX | Dialog<R>, FileChooser, Alert | 現代 UI、FXML 宣告式、CSS 樣式、屬性綁定、非阻塞 showAndWait() 回傳 Optional |
dispose(),避免原生資源洩漏。super(parent, ...) 確保對話框居中顯示、圖示關聯正確。掌握 Dialog 設計精髓,能讓你的桌面應用程式互動流程更清晰、使用者體驗更專業。