java.lang.Object --java.awt.Component --java.awt.Container --java.awt.Window --java.awt.JDialog --javax.swing.JDialog
如果你为公司设计一套“物品工具借用系统”,在这个系统中,借用物品的员工必须详细填员工编号、借用物品、借用器具、借 用日期、预计归还日期时间、借用原因等等,若没有详细填这此数据,就无法取得准许借用物品的证明文件。因此在设计这套系统 的过程中,你必须查看用户是否已经填妥相关数据,若员工忘记了填写某些重要字段,系统应该给予警示,提醒用户哪些字段必须 填写。这个情况也常发生在网络问卷或网络会员注册系统,用户必须填写相关数据,例如用户若没有填写E-Mail邮件地址,则系统 会提示你应当填写邮件地址,否则系统将不处理用户填写的信息。
为应付这种情况,java提供了JDialog与JOptionPane供我们使用,事实上,JOptionPane是阳春版的JDialog,当你在使用 JOptionPane时,系统会自动产生JDialog组件,并将JOptionPane的内容放入JDialog的ContentPane中,而这些均由系统在背后自动 运行,并不需要由我们介入。使用JOptionPane的好处是此组件已经默认了许多交互方式,你只用设置想要的显示模式,JOptionPane 就能轻易的显示出来,可说相当方便,若这些模式还是无法满足你的需求,你就可以使用JDialog来自行设计你的对话框。 我们先来看如何构造JDialog,JOptionPane将在后半段介绍:
上面所说的modal是一种对话框操作模式,当modal为true时,代表用户必须结束对话框才能回到原来所属的窗口。当modal为 false时,代表对话框与所属窗口可以互相切换,彼此之间在操作上没有顺序性。
一般而言对话框都会依附在某个窗口上,例如JFrame或JDialog,原因在于对话框通常是一个程序运行的过程中与用户互动的中 间过程,在使用JDialog上跟JFrame非常相似,由上面的JDialog层次结构图中你可以发现,JDialog是继承AWT的Dialog类而来,因 此JDialog为一个Heavyweight组件。要加入组件到JDialog上与JFrame是一样的,你必须先取得JDialog的ContentPane,然后再把组 件加到此ContentPane中,JDialog默认的版面管理器是BorderLayout.
我们来看一个JDialog的例子,在这个例子中,用户在主窗口按下"借用物品"的按钮时,会跳出一个让用户填写窗体的JDialog 窗口,用户必须结束此JDialog窗口后才能返回主窗口.
import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.awt.event.*; import java.util.*; import com.incors.plaf.alloy.*; import com.incors.plaf.alloy.themes.glass.*; public class DialogDemo implements ActionListener { JFrame f = null; public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("借用物品")) { new LendingSystem(f); } else if (cmd.equals("离开系统")) { System.exit(0); } } public DialogDemo() { f = new JFrame("JDialog Example"); Container contentPane = f.getContentPane(); JPanel buttonPanel = new JPanel(); JButton b = new JButton("借用物品"); b.addActionListener(this); buttonPanel.add(b); b = new JButton("离开系统"); b.addActionListener(this); buttonPanel.add(b); buttonPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory .createLineBorder(Color.blue, 2), "借用物品系统", TitledBorder.CENTER, TitledBorder.TOP)); contentPane.add(buttonPanel, BorderLayout.CENTER); f.pack(); f.setVisible(true); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { SwingUtil.setLookAndFeel(); new DialogDemo(); } } class LendingSystem implements ActionListener { JTextField staffField, objectField, borrowDateField, returnDateField, reasonField; JDialog dialog; public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("确定")) { } else if (cmd.equals("取消")) { dialog.dispose(); } } LendingSystem(JFrame f) { dialog = new JDialog(f, "借用物品", true); GridBagConstraints c; int gridx, gridy, gridwidth, gridheight, anchor, fill, ipadx, ipady; double weightx, weighty; Insets inset; GridBagLayout gridbag = new GridBagLayout(); Container dialogPane = dialog.getContentPane(); dialogPane.setLayout(gridbag); JLabel label = new JLabel("员工编号 : "); gridx = 0; // 第0列 gridy = 0; // 第0行 gridwidth = 1; // 占一单位宽度 gridheight = 1; // 占一单位高度 weightx = 0; // 窗口增大时组件宽度增大比率0 weighty = 0; // 窗口增大时组件高度增大比率0 anchor = GridBagConstraints.CENTER; // 容器大于组件size时将组件置于容器中央 fill = GridBagConstraints.BOTH; // 窗口拉大时会填满水平与垂直空间 inset = new Insets(0, 0, 0, 0); // 组件间间距 ipadx = 0; // 组件内水平宽度 ipady = 0; // 组件内垂直高度 c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, inset, ipadx, ipady); gridbag.setConstraints(label, c); dialogPane.add(label); label = new JLabel("借用器具 : "); gridx = 3; gridy = 0; c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, inset, ipadx, ipady); gridbag.setConstraints(label, c); dialogPane.add(label); label = new JLabel("借用日期: "); gridx = 0; gridy = 1; c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, inset, ipadx, ipady); gridbag.setConstraints(label, c); dialogPane.add(label); label = new JLabel("归还日期: "); gridx = 3; gridy = 1; c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, inset, ipadx, ipady); gridbag.setConstraints(label, c); dialogPane.add(label); label = new JLabel("借用原因 : "); gridx = 0; gridy = 2; c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, inset, ipadx, ipady); gridbag.setConstraints(label, c); dialogPane.add(label); staffField = new JTextField(); gridx = 1; gridy = 0; gridwidth = 2; gridheight = 1; weightx = 1; weighty = 0; c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, inset, ipadx, ipady); gridbag.setConstraints(staffField, c); dialogPane.add(staffField); objectField = new JTextField(); gridx = 4; gridy = 0; c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, inset, ipadx, ipady); gridbag.setConstraints(objectField, c); dialogPane.add(objectField); borrowDateField = new JTextField(); gridx = 1; gridy = 1; c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, inset, ipadx, ipady); gridbag.setConstraints(borrowDateField, c); dialogPane.add(borrowDateField); returnDateField = new JTextField(); gridx = 4; gridy = 1; c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, inset, ipadx, ipady); gridbag.setConstraints(returnDateField, c); dialogPane.add(returnDateField); reasonField = new JTextField(); gridx = 1; gridy = 2; gridwidth = 5; c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, inset, ipadx, ipady); gridbag.setConstraints(reasonField, c); dialogPane.add(reasonField); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(1, 2)); JButton b = new JButton("确定"); panel.add(b); b = new JButton("取消"); b.addActionListener(this); panel.add(b); gridx = 0; gridy = 3; gridwidth = 6; weightx = 1; weighty = 1; c = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, weightx, weighty, anchor, fill, inset, ipadx, ipady); gridbag.setConstraints(panel, c); dialogPane.add(panel); dialog.setBounds(200, 150, 400, 130); dialog.show(); } } class SwingUtil { public static final void setLookAndFeel() { try { Font font = new Font("JFrame", Font.PLAIN, 12); Enumeration keys = UIManager.getLookAndFeelDefaults().keys(); while (keys.hasMoreElements()) { Object key = keys.nextElement(); if (UIManager.get(key) instanceof Font) { UIManager.put(key, font); } } AlloyLookAndFeel.setProperty("alloy.isLookAndFeelFrameDecoration", "true"); AlloyTheme theme = new GlassTheme(); LookAndFeel alloyLnF = new AlloyLookAndFeel(theme); UIManager.setLookAndFeel(alloyLnF); } catch (UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } /* * try{ Font font = new Font("JFrame", Font.PLAIN, 12); Enumeration keys * = UIManager.getLookAndFeelDefaults().keys(); * * while (keys.hasMoreElements()) { Object key = keys.nextElement(); if * (UIManager.get(key) instanceof Font) { UIManager.put(key, font); } } * UIManager * .setLookAndFeel("com.stefankrause.xplookandfeel.XPLookAndFeel"); * }catch(Exception e){ e.printStackTrace(); } */ } }