我有 3 个扩展了 JFrame
的对象,我们称它们为 FrameA
FrameB
FrameC
。
FrameA
是我的主应用程序窗口。如果应用程序未注册,我会从 FrameA
的构造函数创建 FrameB
和 FrameC
。它们只是指示试用期的弹出窗口。
十分之二的应用程序卡住并且从不显示 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,但是当您分离职责时,几乎问题就会消失。
关于java - 从另一个 JFrames 构造函数创建 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1263660/