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 theRootPane
, and if so, sets theRootPane
's default button to null to ensure theRootPane
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();
}
精彩评论