java - 如果放置在 setVisible(true) 之后,JDialog 中的事件处理程序将不起作用

标签 java swing jdialog

这是一个有趣的问题,当我构建最后一个 JDialog 时没有出现,尽管那个问题比这个复杂得多。无论如何,这是导致问题的代码。

public class Test extends JDialog{

private final JButton cancel, ok;
private final JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 50, 5));

public Test(JFrame parent) {
    //Initialize the JDialog
    super(parent, "Select Chapters");
    setLayout(new BorderLayout());
    setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    setModalityType(JDialog.ModalityType.APPLICATION_MODAL);
    setSize(300, 300);
    setLocationRelativeTo(null);


    cancel = new JButton("Cancel");
    ok = new JButton("OK");
    buttonPanel.add(cancel);
    buttonPanel.add(ok);
    getContentPane().add(buttonPanel, BorderLayout.SOUTH);



    setVisible(true);

    cancel.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent ae) {
            dispose();
        }
    });


}}

以及主要方法

Test test = new Test(new JFrame());

我将事件监听器放在构造函数中进行测试,但实际的实现应该发生在另一个类中。这就是为什么这是一个问题。如果我将 Action 监听器放在 setVisible(true) 之前,那么一切都会按预期进行。但我不能这样做,因为事件处理程序是在另一个类中实现的。是什么导致了这个问题以及如何解决它?

最佳答案

Event handler in JDialog not working if placed after setVisible(true)

正确,因为 JDialog 是模态的,所以 setVisible() 之后的语句要等到对话框关闭后才会执行。

在对话框可见之前,您没有理由不能将 ActionListener 添加到按钮。代码位于单独的类中并不重要。您只需在创建按钮的类的构造函数中创建该类的实例即可。

I put setVisible() in the other class after I implemented the listeners

你还是做错了什么。 setVisible() 应该位于您的主类中,您可以在其中设置对话框属性并创建所有组件并将组件添加到对话框中。

我不知道你为什么这样做。您的代码可以是这样的:

cancel = new JButton("Cancel");
cancel.addActionListener( new SomeActionListenerClass() );
...
setVisible( true );

关于java - 如果放置在 setVisible(true) 之后,JDialog 中的事件处理程序将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33193236/

相关文章:

java - Install4j:多个脚本或自定义操作的通用回滚操作

java - 如何删除字符串中字符 ( 和 ) 之间的所有字母?

java - 模型更改时自动更新 jtable 列

java JPanel如何固定大小

java - 如何仅关闭 JDialog 并使 JFrame 仍然可用

Java:如何判断何时移动 JFrame 或 JDialog?

java - 带字节数组的邮件附件

在较旧的 Oracle 版本中编译的 Java 代码在 Oracle 12.2 中出现编译错误

java - 旋转形状并在原始位置绘制

java - 如何在另一个包的 JFrame 中使用 JDialog?