gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:18:14 25 4
gpt4 key购买 nike

我正在开发一个简单的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com