开发者

Default Button after dispose and setVisible

given the following code:

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

Shouldn't pressing the Enter key write something to the console? According to the docs (http://java.sun.com/javase/7/docs/api/java/awt/Window.html#dispose()):

The Window and its subcomponents can be made displayable again by rebuilding the native resources开发者_开发问答 with a subsequent call to pack or show. The states of the recreated Window and its subcomponents will be identical to the states of these objects at the point where the Window was disposed

Is this intended behaviour?


The reason is that in JButton.removeNotify (which seems to be called at dispose) the DefaultButton is reset:

Overrides JComponent.removeNotify to check if this button is currently set as the default button on the RootPane, and if so, sets the RootPane's default button to null to ensure the RootPane doesn't hold onto an invalid button reference.


public void removeNotify() {
    JRootPane root = SwingUtilities.getRootPane(this);
    if (root != null && root.getDefaultButton() == this) {
        root.setDefaultButton(null);
    }
    super.removeNotify();
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜