我有 3 个扩展的对象,JFrame
我们称之为它们FrameA
FrameB
FrameC
。
FrameA
是我的主要应用程序窗口。FrameA
如果应用程序未注册,则从 的构造函数中创建FrameB
和FrameC
. 它们只是表示试用期的弹出窗口。
10 次中有 2 次应用程序冻结并且从不显示 B 和 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,但是当您分离责任时,几乎所有问题都会消失。
您描述的症状听起来像是锁定了事件线程 - 这可能与您启动框架的方式有任何关系,也可能没有任何关系 - 您将希望在调试器中运行以及何时开始显示症状检查事件线程的状态。
(虽然我同意线程中的其他人的观点,即您应该将框架启动逻辑拉到其他地方 - 但是 - 从另一个框架构造函数调用框架构造函数并没有什么“不安全”的 - 它们与任何其他构造函数没有什么不同。这可能是糟糕的设计 - 但它不应该锁定事件线程。)
您将要使用 JDialog。有做这个确切的事情。
你应该想想你的逻辑。在另一个框架的构造函数中创建新框架听起来很奇怪。如果您在构造函数中执行此操作 - 这意味着尚未显示第一帧。为什么不在框架 A 构造函数之外显示框架 B 和 C - 从逻辑上讲,它似乎是相同的。但是根据您的条件,您可以创建框架 A 并将其设置为可见。