我有一个使用JFrames创建的相当简单的Java应用程序。我的程序中 多个JFrame。我在程序开头有一个菜单启动。通过菜单后,我将JFrame菜单处理完毕。
主JFrame有一个菜单按钮,可以在以后启动完全相同的菜单。但是,当您从ActionListener内部启动菜单时(按菜单按钮时),JFrame无法正常启动。没有任何组件出现,颜色也没有。
但是,当从ActionListener外部启动菜单时,JFrame会完美显示。我已经尝试了多种方法来解决这个问题,但是没有一种方法可以解决这个问题。
我的完整程序代码可由clicking here获得。
================================ EDIT =========== =====================
另外,我想告诉您,我发现我的代码有点乱。我不知道怎么写这个程序的代码。
我被迫使用Thread.sleep(x);
,因为Swing计时器并不是我想要的。当计时器关闭时,Swing计时器激活一个ActionListener。我需要一个在继续使用代码之前等待一秒钟的系统。
我意识到在其中使用ActionListeners的while (repeater==0)
循环看起来很疯狂,但这是我能让它工作的唯一方法。如果我放了一个ActionListener并且只是在while循环中没有代码,那么当按下按钮时没有任何反应。
我会像 MadProgrammer 一样提到:
建议:废弃当前的方法并重新开始。
但是,我的程序当前编码的方式是我知道如何获得我需要做的事情的唯一方法。我阅读了这些教程,但仍然不知道如何以你告诉我的方式改进代码。
我感谢大家试图告诉我改进我的糟糕的Java语法"但是就我而言,我不打算在接下来的20年里继续这个计划并让我的数百万离开它。
我之前看过Swing计时器,我理解了整个new Timer(speed, this);
概念,但我不明白这会如何使我的代码更好。
如果有人想告诉我如何修复我的ActionListeners或Thread.sleep(x);
行,请告诉我。谢谢。
答案 0 :(得分:3)
您使用Thread.sleep(3000);
阻止事件调度线程 - 不要这样做,它会阻止UI被绘制
有关问题的详细信息,请参阅Concurrency in Swing;有关可能的解决方案,请参见How to use Swing Timers
您可能还需要考虑查看The Use of Multiple JFrames, Good/Bad Practice?并考虑使用CardLayout
或JTabbedPane
如果您需要暂时阻止用户(显示错误消息或收集重要详细信息),请考虑使用模式JDialog
。有关详细信息,请参阅How to Make Dialogs