2015-05-05 52 views
1

我正在研究Java應用程序。主類框架名稱爲「a」。在框架「a」中,有一個組件 - jCheckBox。所以當我檢查(勾選)這個jCheckBox時,它會打開另一個框架「b」。我想在關閉frame「b」時去掉jCheckBox,但它看起來像不能工作。任何想法如何解決這個問題?謝謝。如何在關閉子框架時自動取消選中(取消選中)jCheckBox?

編輯:但是,我可以關閉框架「b」通過取消框架a中的jCheckBox(在主類框架中)。我想實現的是當我關閉框架「b」時,它應該自動取消選中jCheckBox框架「a」。編譯我的應用程序後,IDE向我顯示了很多錯誤。

我的代碼: (在主框架A)

private void jCheckBoxInfoActionPerformed(java.awt.event.ActionEvent evt) {            
     if (jCheckBoxInfo.isSelected()) { 
       System.err.println("Frame B is opened"); 
       b.setVisible(true); 
      } else { 
       System.err.println("Frame B is closed"); 
       frameInfo.setVisible(false); 
      } 
     } 

在幀B:

private void formWindowClosing(java.awt.event.WindowEvent evt) { 
    boolean selected = a.jCheckBoxInfo.isSelected(); 
    System.err.println(selected); //To check the status of jCheckBoxInfo 
    a.jCheckBoxInfo.setSelected(false); } 

輸出:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
    at sun.awt.Win32GraphicsConfig.getBounds(Native Method) 
    at sun.awt.Win32GraphicsConfig.getBounds(Win32GraphicsConfig.java:222) 
    at java.awt.Window.init(Window.java:505) 
    at java.awt.Window.<init>(Window.java:537) 
    at java.awt.Frame.<init>(Frame.java:420) 
    at java.awt.Frame.<init>(Frame.java:385) 
    at javax.swing.JFrame.<init>(JFrame.java:189) 
    at b.<init>(b.java:30) 
    at a.<init>(a.java:36) 
    at b.<init>(b.java:26) 
    at a.<init>(a.java:36) 
+1

堆棧跟蹤看起來像是從'a'構造函數(或等價物)創建'b'實例,反之亦然=>堆棧溢出。 – kiheru

+0

這是正確的。當我點擊關閉的「X」按鈕時發生 - 關閉框架B的窗口。 –

+0

問題是*爲什麼*你會從'b'創建更多'a'實例。問題是相互遞歸的對象構造。只需保留對現有框架的引用。 – kiheru

回答

0

在框架A中,我確實公開訪問了類b。代碼 - > public b frameInfo = new b();在框架B中,我確實給類a做過類似的回調。代碼 - > public a frameMain = new a();我試圖讓應用程序自動取消選中框架a中的jCheckBoxInfo。

new a()是問題所在;你並沒有取消選中現有框中的框,而是創建一個新窗口並在那裏取消選中它(這反過來導致更多的窗口被創建爲無限大;或者直到堆棧溢出)。

相反,您可以:

  1. b添加WindowListener而在a(可能使用匿名內部類,延長WindowAdapter),而不是。然後您可以直接參考windowClosing()中的複選框。這可能是最簡潔的方法,因爲它可以避免比a更緊密地綁定b,並且在a中完全保留可見性處理。
  2. 如果b框架與a作爲父窗口的對話框,您可以通過以下方式獲取所有者窗口:getOwner(),將其轉換爲a並取消選中此處的複選框。
  3. 如果沒有所有者窗口(在這種情況下看到about using multiple frames),你可以在a實例傳遞給b,例如作爲構造函數的參數:

    class b { 
        final a parent; 
        public b(a parent) { 
         this.parent = parent; 
         ... 
        } 
    } 
    

    ,然後你可以使用剛剛取消選中該複選框parent參考。

  4. 如果ba的內部類,則它具有對封閉對象的隱式引用,它可以被稱爲a.this

在任何情況下,使用一個參照現有a,在您創建的b,而不是創造ba