java - 添加 JFrame 事件处理程序之前滞后?

标签 java swing netbeans concurrency event-dispatch-thread

我正在开发一个简单的 Java swing 项目。这是主类的代码(名称已更改):

public class MainProg
{
    private static MainProg program; 

    //mainWin is a JFrame
    private MainWindow mainWin;

    //Event handler class which extends MouseAdapter
    private TrayManager trayMgr;


    public static void main(String[] args)
    {                
        program = new MainProg();
    }

    public MainProg()
    {
        mainWin = new MainWindow();
        trayMgr = new TrayManager();

        mainWin.startBtn.addMouseListener(trayMgr);

        mainWin.setVisible(true);
    }
}

很明显,当程序启动时,在 main() 中它创建了一个 MainProg 类的新实例,然后调用构造函数。在构造函数中,它创建了 JFrame mainWin 的新实例。然后它将事件处理程序附加到 mainWin 上的按钮。

在事件处理程序类 trayMgr 中,唯一的方法是 mouseClicked(),它什么都不做 除了 System.out.println('Clicked');

问题是,当我在 Netbeans 中运行这个程序时,JFrame 会立即显示,但我似乎必须在控制台中打印消息之前单击按钮 2-3 次。

这只是 Netbeans 特有的东西,还是我必须更改一些东西才能在窗口可见之前设置事件处理程序?

最佳答案

您的线程问题不太可能导致您当前的问题,但理论上存在问题的可能性,而且我已经看到一些与一些更棘手的外观相关的实际问题。很简单,您应该将启动 GUI 的代码排队到 Swing 事件线程中。您可以通过以下方式做到这一点:

public void main(String[] args) {
  SwingUtilities.invokeLater(new Runnable(
    public void run() {
      program = new MainProg();
    }
  ));
}

其他人建议使用 invokeAndWait(...) 而不是 invokeLater(...) 但这可能有风险,特别是如果您不小心从Swing 事件线程本身。对于您的情况,您最好使用 invokeLater(...)

但是,我认为您所显示的代码的主要问题是在本应使用 ActionListener 的地方不恰本地使用了 MouseListener。学习编写任何 GUI 库的代码可能非常棘手,因此,您不能假设任何事情。查看教程并向专家学习。此外,如果您正在考虑长期编写 Swing 代码,请考虑放弃 NetBean 的代码生成实用程序并首先学习手动编写 Swing 代码。你不会后悔这样做的。

关于java - 添加 JFrame 事件处理程序之前滞后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12273258/

相关文章:

java - 使用 KafkaTransactionManager 在事务 KafkaTemplate 中进行基于事件的提交

Java - 如何将一个整数分成5个随机部分

java - 没有类定义错误android studio

java - JTextField Keylistener 无法删除输入

java - 如何使用java调整图像大小而不损失质量?

Java 小程序的使用

java - Netbeans:如何知道我当前正在查看什么 JAR

java - 如何通过Java中方法的参数更改所使用的方法

Java线程和高cpu使用率

netbeans - 从 Netbeans 项目中删除文件,但不从硬盘驱动器中删除