dispose 和 setVisible 后的默认按钮

发布于 2024-08-31 06:32:56 字数 1014 浏览 7 评论 0原文

给出以下代码:

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 及其子组件可以 可以再次显示 重建本地资源 随后调用打包或展示。 的 重新创建的窗口及其状态 子组件将与 这些对象在该点的状态 窗口放置的位置

这是预期的行为吗?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最笨的告白 2024-09-07 06:32:56

原因是在 < code>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();
}

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();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文