【发布时间】:2012-09-05 01:07:28
【问题描述】:
我正在做一个简单的 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 特有的,还是我必须更改某些内容才能在窗口可见之前设置事件处理程序?
【问题讨论】:
-
您是否有机会添加 SSCCE 来证明问题?
-
为什么还要向 JButton 添加 MouseListener?你几乎不应该这样做。
-
ActionListener 处理 JButton 的点击。如果您使用 MouseListener,您可能会弄乱按钮的功能。你需要阅读教程,因为有很多东西要学。
-
再次,最重要的是,摆脱那个 MouseListener 并使用一个 ActionListener。请回来报告,看看是否有任何作用。在您第一次学会手动编写 Swing 代码之前,我自己的偏见是反对使用 NetBeans 为您生成 GUI 代码。它不是一个简单的点击工具,如果您不熟悉 Swing 的基本原理,可能会失败。
标签: java swing netbeans concurrency event-dispatch-thread