Кнопка по умолчанию после утилизации и setVisible - PullRequest
3 голосов
/ 28 апреля 2010

с учетом следующего кода:

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()):

Окно и его подкомпоненты можно снова сделать отображаемыми, перестроив собственные ресурсы с последующим вызовом упаковать или показать. Состояния воссозданного Окнаи его подкомпоненты будут идентичны состояниям этих объектов в точке, где было расположено Окно

Это предполагаемое поведение?

1 Ответ

1 голос
/ 28 апреля 2010

Причина в том, что в JButton.removeNotify (который, кажется, вызывается при dispose) DefaultButton сбрасывается:

Переопределяет JComponent.removeNotify, чтобы проверить, установлена ​​ли эта кнопка в качестве кнопки по умолчанию на RootPane, и, если это так, устанавливает для кнопки RootPane по умолчанию значение NULL, чтобы гарантировать, что RootPane не удерживается на недействительную ссылку кнопки.


public void removeNotify() {
    JRootPane root = SwingUtilities.getRootPane(this);
    if (root != null && root.getDefaultButton() == this) {
        root.setDefaultButton(null);
    }
    super.removeNotify();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...