代码之家  ›  专栏  ›  技术社区  ›  Hamza Yerlikaya

从另一个JFrames构造函数创建JFrame

  •  2
  • Hamza Yerlikaya  · 技术社区  · 15 年前

    我有3个对象可以扩展 JFrame 我们打电话给他们 FrameA FrameB FrameC .

    框架 是我的主要应用程序窗口。从 框架 的构造函数如果应用程序未注册,则创建 框架 弗雷马克 . 它们只是显示试用期的弹出窗口。

    10个应用程序中有2次冻结,并且从未显示B anc C帧,而A帧则无响应。

    我想知道用这种方式创建框架是否有副作用?

    4 回复  |  直到 9 年前
        1
  •  2
  •   OscarRyz    15 年前

    这是因为你没有让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();
               }  
    
          }
    

    在第二个代码中要做的是将逻辑与类构造函数分离,并将其放入工厂方法中。这样如果 这个特殊的逻辑是它应该弹出 返回true,显示b和c

    如前所述,您也可以在那里使用JDialog,但是当您分离职责时,几乎所有的问题都会消失。

        2
  •  1
  •   Nate    15 年前

    您描述的症状听起来像是锁定了事件线程——这可能与您如何启动帧无关——您希望在调试器中运行,并且当它开始显示症状时,检查事件线程的状态。

    (尽管我同意线程中的其他所有人的观点,您应该将框架启动逻辑拉到其他地方——但是,从另一个框架构造函数调用框架构造函数没有什么“不安全”的地方——它们与任何其他构造函数都没有区别。这可能是一个糟糕的设计——但它不应该锁定事件线程。)

        3
  •  0
  •   Brandon    15 年前

    您将要使用JDialog。有必要做这件事。

        4
  •  0
  •   Eugene Ryzhikov    15 年前

    你应该考虑一下你的逻辑。在另一帧的构造函数中创建新帧听起来很奇怪。如果您在构造函数中这样做-这意味着第一帧还没有显示出来。为什么不向您展示框架A构造函数外部的框架B和C——逻辑上看起来是相同的。但根据您的条件,您可以创建框架A并将其设置为可见。