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