给出以下代码:
public class DialogTest implements ActionListener {
public static void main(String[] args) {DialogTest g = new DialogTest();}
public DialogTest() {
JButton b1 = new JButton("Button A");
b1.addActionListener(this);
JDialog d = new JDialog();
d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
JPanel p = new JPanel();
p.add(b1);
d.add(p);
d.getRootPane().setDefaultButton(b1);
d.pack();
d.setVisible(true);
d.dispose();
d.pack();
d.setVisible(true);
}
public void actionPerformed(ActionEvent e) {System.out.println("hello");}
}
不应按Enter键向控制台写一些内容吗?根据文档(http://java.sun.com/javase/7/docs/api/java/awt/Window.html#dispose()):
Window及其子组件可以 再次显示出来 用a重建本机资源 随后打包或显示。的的 重建窗口的状态及其状态 子组件将与。相同 这一点上的这些对象的状态 窗户被放置的地方
这是预期的行为吗?
答案 0 :(得分:1)
原因是在JButton.removeNotify
(似乎在dispose
处调用)DefaultButton
被重置:
覆盖
JComponent.removeNotify
以检查此按钮当前是否已设置为RootPane
上的默认按钮,如果是,则将RootPane
的默认按钮设置为null以确保{ {1}}不会保留无效的按钮引用。
RootPane