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