当我处理并重新打开 JFrame 时,它没有显示任何内容
When I dispose and reopen a JFrame, it doesn't show anything
我有一个使用 JFrames 创建的相当简单的 Java 应用程序。我的程序中有个以上的JFrame。我在程序开始时启动了一个菜单。浏览完菜单后,我处理了菜单 JFrame。
主 JFrame 有一个菜单按钮,稍后应该会启动完全相同的菜单。但是,当您从 ActionListener 内部启动菜单时(当您按下菜单按钮时),JFrame 无法正常启动。 None 的组件出现并且颜色关闭。
但是,当从 ActionListener 外部启动菜单时,JFrame 会完美显示。我尝试了多种方法来解决这个问题,但其中 none 有效。
我的完整程序代码可在 clicking here 获得。
- 主要class是"LetsMultiply5.java"。 class 还设置了 ActionListener。
- 导致问题的 JFrame 是 "MenuWindow.java"。
- "LetsMultiply5.java" 调用 "Booter.java" class,然后调用 "MenuWindow.java".
- "MainWindow.java" 是具有 "Menu" 按钮的 JFrame。
- 为了证明,"SpeedModer.java" 在处理后调用菜单 window 并起作用。
================================编辑======= ===========================
另外,我想让你知道我意识到我的代码有点乱。我不确定如何为这个程序编写代码。
我被迫使用 Thread.sleep(x);
因为 Swing 计时器不是我要找的。当计时器关闭时,Swing 计时器会激活一个 ActionListener。我需要一个能在继续代码之前等待一秒钟的系统。
我意识到其中带有 ActionListeners 的 while (repeater==0)
循环看起来很疯狂,但这是我让它工作的唯一方法。如果我放置一个 ActionListener 并且只让 while 循环在其中不执行任何代码,那么当我按下按钮时什么也不会发生。
我会,正如 MadProgrammer 提到的那样:
Advice: Scrap your current approach and start again.
但是,我目前对程序进行编码的方式是我知道如何完成我需要做的事情的唯一方式。我阅读了教程,但仍然不知道如何按照您告诉我的方式改进代码。
我感谢大家试图告诉我改善我的缺点 "Java grammar",但就我而言,我不会在接下来的 20 年里继续这个计划并从中赚取数百万美元它。
我以前看过 Swing 计时器,我理解整个 new Timer(speed, this);
概念,但我不明白这如何让我的代码变得更好。
如果有人想告诉我如何修复我的 ActionListeners 或 Thread.sleep(x);
行,请告诉我。谢谢。
您正在使用 Thread.sleep(3000);
阻塞事件调度线程 - 不要这样做,它会阻止 UI 被绘制
有关可能的解决方案,请参阅 Concurrency in Swing for more details about the problem and How to use Swing Timers
您可能还想考虑看看 The Use of Multiple JFrames, Good/Bad Practice? and consider using CardLayout
or JTabbedPane
如果您需要暂时阻止用户(以显示错误消息或收集重要详细信息),请考虑使用模式 JDialog
。有关详细信息,请参阅 How to Make Dialogs
我有一个使用 JFrames 创建的相当简单的 Java 应用程序。我的程序中有个以上的JFrame。我在程序开始时启动了一个菜单。浏览完菜单后,我处理了菜单 JFrame。
主 JFrame 有一个菜单按钮,稍后应该会启动完全相同的菜单。但是,当您从 ActionListener 内部启动菜单时(当您按下菜单按钮时),JFrame 无法正常启动。 None 的组件出现并且颜色关闭。
但是,当从 ActionListener 外部启动菜单时,JFrame 会完美显示。我尝试了多种方法来解决这个问题,但其中 none 有效。
我的完整程序代码可在 clicking here 获得。
- 主要class是"LetsMultiply5.java"。 class 还设置了 ActionListener。
- 导致问题的 JFrame 是 "MenuWindow.java"。
- "LetsMultiply5.java" 调用 "Booter.java" class,然后调用 "MenuWindow.java".
- "MainWindow.java" 是具有 "Menu" 按钮的 JFrame。
- 为了证明,"SpeedModer.java" 在处理后调用菜单 window 并起作用。
================================编辑======= ===========================
另外,我想让你知道我意识到我的代码有点乱。我不确定如何为这个程序编写代码。
我被迫使用 Thread.sleep(x);
因为 Swing 计时器不是我要找的。当计时器关闭时,Swing 计时器会激活一个 ActionListener。我需要一个能在继续代码之前等待一秒钟的系统。
我意识到其中带有 ActionListeners 的 while (repeater==0)
循环看起来很疯狂,但这是我让它工作的唯一方法。如果我放置一个 ActionListener 并且只让 while 循环在其中不执行任何代码,那么当我按下按钮时什么也不会发生。
我会,正如 MadProgrammer 提到的那样:
Advice: Scrap your current approach and start again.
但是,我目前对程序进行编码的方式是我知道如何完成我需要做的事情的唯一方式。我阅读了教程,但仍然不知道如何按照您告诉我的方式改进代码。
我感谢大家试图告诉我改善我的缺点 "Java grammar",但就我而言,我不会在接下来的 20 年里继续这个计划并从中赚取数百万美元它。
我以前看过 Swing 计时器,我理解整个 new Timer(speed, this);
概念,但我不明白这如何让我的代码变得更好。
如果有人想告诉我如何修复我的 ActionListeners 或 Thread.sleep(x);
行,请告诉我。谢谢。
您正在使用 Thread.sleep(3000);
阻塞事件调度线程 - 不要这样做,它会阻止 UI 被绘制
有关可能的解决方案,请参阅 Concurrency in Swing for more details about the problem and How to use Swing Timers
您可能还想考虑看看 The Use of Multiple JFrames, Good/Bad Practice? and consider using CardLayout
or JTabbedPane
如果您需要暂时阻止用户(以显示错误消息或收集重要详细信息),请考虑使用模式 JDialog
。有关详细信息,请参阅 How to Make Dialogs