我有3个对象延伸JFrame让我们称之为FrameA FrameB FrameC

FrameA是我的主应用程序窗口。从FrameA的构造函数,如果应用程序没有注册创建FrameBFrameC。他们只是在弹出的指示试用期。

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画幅的构造方法之外 - 在逻辑上似乎是相同的。但随后根据您的情况,您可以创建一个框架,并将其设置可见。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top