[瘋狂Java筆記]AWT:Dialog對話方塊類、FileDialog檔案對話方塊
1. 建立對話方塊:
1) Dialog是Window的子類,屬於特殊容器,用於和使用者互動,必定要實現事件監聽和處理的介面;
2) Dialog是一種可以獨立存在的頂級視窗,當然通常都是具有父視窗的(即依賴於其他視窗產生),但Dialog的父視窗必須是Frame,這是規定好的;
3) 構造器:Dialog(Frame owner, String title, boolean modal);
i. owner:即父視窗,其上級視窗(開啟它的視窗),如果指定為null則表示該對話方塊是頂級視窗,像桌面計算器就屬於這種型別;
ii. title:標題
iii. modal:true為模態對話方塊,false為非模態對話方塊
!!模態對話方塊總是位於上級視窗之上,其關閉前上級視窗無法獲得焦點,非模態則可以;
4) 示例:Frame中的兩個按鈕分別開啟兩種對話方塊
public class AwtTest { public static void main(String[] args) { Frame f = new Frame("Dialog Test"); Dialog dlgModal = new Dialog(f, "Modal Dialog", true); Dialog dlgNonModal = new Dialog(f, "Non-modal Dialog", false); Button btnModal = new Button("Modal"); Button btnNonModal = new Button("Non Modal"); dlgModal.setBounds(20, 30, 300, 400); dlgNonModal.setBounds(100, 200, 300, 400); btnModal.addActionListener(e -> dlgModal.setVisible(true)); btnNonModal.addActionListener(e -> dlgNonModal.setVisible(true)); f.add(btnModal); f.add(btnNonModal, BorderLayout.SOUTH); f.pack(); f.setVisible(true); } }
!!如果主程式需要接受使用者在對話方塊中輸入的值則應該將對話方塊設定成模態對話方塊,因為在使用者輸入時有可能會切換到其它視窗,而模態對話方塊能阻塞這種行為,如果輸入了一般切出去了可能會造成主程式異常;
2. FileDialog——檔案對話方塊:
1) 即用於開啟或儲存檔案的對話方塊,是作業系統提供的常用功能,而AWT則包裝了這一功能;
2) 構造器:FileDialog(Frame parent, String title, int mode);
i. parent當然還是所屬的父視窗了,既然FileDialog也是對話方塊的一種,那麼其父視窗也必須是Frame;
ii. title是標題;
iii. mode在這裡不是模態或非模態了,而是指定該檔案對話方塊的功能,只有兩種,一種是開啟檔案,一種是儲存檔案,由FileDialog的兩個靜態常量決定:LOAD(開啟檔案)、SAVE(儲存檔案),不同模式下顯示的畫面(元件等)不太一樣;
!!那麼檔案對話方塊到底是模態還是非模態的呢?檔案對話方塊依賴執行平臺的,因此作業系統中支援的檔案對話方塊是什麼模式那麼它就表現出什麼模式;
3) 獲取對話方塊中選中或儲存的檔案的路徑和名稱:
i. 主要運用FileDialog提供的兩個方法獲取,一個是getDirectory,一個是getFile;
ii. String getDirectory(); // 返回目標檔案的絕對路徑(不包括檔名)
iii. String getFile(); // 返回目標檔案的名稱(不包含路徑,但包含字尾)
iv. 因此要獲取完整的絕對路徑名應該將上述兩個返回值相加;
!!獲取這些資訊的時機:只有到使用者按了對話方塊的OK按鈕關閉對話方塊後這兩個方法才會返回結果!!
!!FileDialog內部已經解決了所有瑣碎的細節,比如按OK的時候檢查檔案是否重複、是否存在等,如果出現異常會彈出訊息框提示等等,這些都不需要程式設計師關心,都是自動的;
4) 示例:
public class AwtTest {
public static void main(String[] args) {
Frame f = new Frame("FileDialog Test");
FileDialog d1 = new FileDialog(f, "Open File", FileDialog.LOAD);
FileDialog d2 = new FileDialog(f, "Save File", FileDialog.SAVE);
Button b1 = new Button("Open");
Button b2 = new Button("Save");
b1.addActionListener(e -> {
d1.setVisible(true);
System.out.println(d1.getDirectory() + d1.getFile());
});
b2.addActionListener(e -> {
d2.setVisible(true);
System.out.println(d2.getDirectory() + d2.getFile());
});
f.add(b1);
f.add(b2, BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
}