我有3个对象延伸JFrame
让我们称呼他们FrameA
FrameB
FrameC
。
FrameA
是我的主要应用程序窗口。从FrameA
的构造函数中,如果未注册应用程序,我创建FrameB
和FrameC
。它们只是表示试用期的弹出窗口。
10次应用中冻结2次,从未显示B和C帧,帧A变得无法响应。
我想知道是否有以这种方式创建框架的副作用?
答案 0 :(得分:2)
那是因为你没有让FrameA完成它的构建过程,你正在打断它,然后在显示那两个其他帧的同一个线程中。
我建议您更改策略并使用工厂方法,并可能与SwingUtilities.invokeLater方法结合使用。
假设你有类似的东西:
public static void main( String [] args ) {
JFrame a = new FrameA(); // Has both display logic and trial "pop up" logic
}
将其更改为:
public static void main( String [] args ) {
JKFrame a = FrameA.createFrame(); // the same but splited like the following code
}
class FrameA extends JFrame {
// new method
public static JFrame createFrame() {
return new FrameA();
}
}
没有任何改变你只是添加了工厂方法,稍后你可以:
public static JFrame createFrame() {
if( thatSpecialLogicSaysItIsTrialAndShouldPopUp() ) {
JFrame b = new FrameB();
b.setVisible( true );
JFrame c = new FrameC();
c.setVisible( true );
return new FrameA();
} else {
return new FrameA();
}
}
您将在第二个代码中执行的操作是将逻辑与类构造函数分开并将其放在工厂方法中。这样,如果 thatSpecialLogicSaysItIsTrialAndShouldPopUp 返回true,则显示B和C
你也可以如上所述使用JDialog,但是当你分离责任时,问题就会消失。
答案 1 :(得分:1)
您描述的症状听起来像锁定事件线程的东西 - 这可能与您启动框架的方式有关,也可能没有任何关系 - 您需要在调试器中运行并在它开始显示症状时检查事件线程的状态。
(虽然我同意线程中的其他人,你应该将帧启动逻辑拉到其他地方 - 但是 - 从另一个帧构造函数中调用帧构造函数并没有什么“不安全” - 它们与任何框架构造函数都没有区别其他构造函数。它可能是糟糕的设计 - 但它不应该锁定事件线程。)
答案 2 :(得分:0)
你想要使用JDialog。有人做了这件事。
答案 3 :(得分:0)
你应该考虑你的逻辑。在另一帧的构造函数中创建新帧听起来很奇怪。如果你在构造函数中这样做 - 这意味着还没有显示第一帧。你为什么不在框架A构造函数外面显示框架B和C - 从逻辑上看它似乎是相同的。但是根据您的条件,您可以创建框架A并将其设置为可见。