dispose和setVisible之后的默认按钮

时间:2010-04-28 12:53:13

标签: java awt

给出以下代码:

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重建本机资源   随后打包或显示。的的   重建窗口的状态及其状态   子组件将与。相同   这一点上的这些对象的状态   窗户被放置的地方

这是预期的行为吗?

1 个答案:

答案 0 :(得分:1)

原因是在JButton.removeNotify(似乎在dispose处调用)DefaultButton被重置:

  

覆盖JComponent.removeNotify以检查此按钮当前是否已设置为RootPane上的默认按钮,如果是,则将RootPane的默认按钮设置为null以确保{ {1}}不会保留无效的按钮引用。


RootPane