2009-08-12 57 views
2

我有3個擴展的對象JFrame我們稱之爲FrameAFrameBFrameC從另一個JFrames構造函數創建JFrame

FrameA是我的主要應用窗口。如果應用程序未註冊,則從FrameA的構造函數創建FrameBFrameC。它們只是表示試用期的彈出窗口。

10次應用程序凍結2次,從不顯示B和C幀並且幀A變爲無響應。

我想知道是否有以這種方式創建框架的副作用?

回答

2

這是因爲您不讓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(); 
      } 

     } 

什麼你將在第二個代碼中做的是從類構造函數中分離出邏輯並將其放入因子中y方法。這樣,如果thatSpecialLogicSaysItIsTrialAndShouldPopUp返回true,則顯示B和C

您還可以作爲描述使用一個JDialog有,但相當多,當你分開responsabilities的問題將不復存在。

0

你會想要使用一個JDialog。有做這個確切的事情。

0

你應該考慮你的邏輯。在另一個框架的構造函數中創建新框架聽起來很奇怪。如果你在構造函數中這樣做 - 這意味着第一幀尚未顯示。你爲什麼不向框架A和框架外部的框架B展示框架 - 從邏輯上講它似乎是相同的。但根據您的情況,您可以創建框架A並將其設置爲可見。

1

您描述的症狀聽起來像某事鎖定了事件線程 - 這可能與可能與啓動幀的方式無關 - 您需要在調試器中運行,並且當它開始展示症狀檢查事件線程的狀態。 (雖然我會同意線程中的其他人都應該將框架啓動邏輯拉到其他地方 - 但是 - 從另一個框架構造函數調用框架構造函數沒有什麼「不安全」 - 它們與任何其他的構造函數,它可能是不好的設計 - 但它不應該鎖定事件線程。)

相關問題