题
我有3个对象延伸JFrame
让我们称之为FrameA
FrameB
FrameC
。
FrameA
是我的主应用程序窗口。从FrameA
的构造函数,如果应用程序没有注册创建FrameB
和FrameC
。他们只是在弹出的指示试用期。
2倍总分10应用冻结和从未表示B ANC C画幅和帧A变得无法响应。
我想知道是否有以这种方式创建帧的副作用
解决方案
那是因为你没有让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有,但相当多,当你分开responsabilities的问题将不复存在。
其他提示
您描述喜欢的东西的声音真实锁定了事件线程的症状 - 这可能会或可能不会有什么关系,你是如何启动帧 - 你要在一个调试器中运行,并开始显示症状时检查事件线程的状态。
(虽然我会在线程其他人,你应该下拉框启动逻辑到其他地方一致 - 但是 - 没有什么“不安全”是关于来自另一帧的构造函数调用框架构造 - 他们没有任何不同其它构造可能是糟糕的设计 - 。但它不应该锁定事件线程)
您会想使用一个JDialog。有言尽于此确切的事情。
您应该想想你的逻辑。在另一帧的构造新的帧的创作听起来很奇怪。如果您在构造函数中做这件事 - 这意味着,第一帧是没有表现出。你为什么不告诉你帧B和C画幅的构造方法之外 - 在逻辑上似乎是相同的。但随后根据您的情况,您可以创建一个框架,并将其设置可见。