2013-11-03 92 views
-2

不知怎的,我無法訪問&關閉具有withDispose()的JFrame,它給了我一個nullPointerException。我也不想做一個System.exit(0)。我如何直接訪問JFrame,是否有解決方法來關閉JFrame?如何關閉窗口而不是JFrame

public static void main(String[] args) 
{ 
    EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      try 
      { 
       frame = new ScannerUI(); 
       frame.setVisible(true);       
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      }   

     } 
    });   

}

...(進一步下跌,我已經不能訪問的JFrame,給了我一個NullPointerException)

    btnBack.setBounds(400, 270, 80, 40); 
        panel.add(btnBack); 
        btnBack.setText ("BACK");  
        btnBack.addActionListener(new ActionListener() 
        { 
         public void actionPerformed(ActionEvent e) 
         { 
          //ScannerUI.DISPOSE_ON_CLOSE(); 
          //frame.dispose(); 
          //this.dispose(); 
          //frame.setVisible(false); 
          //System.out.println ("dsakjf;dsalkhfsa;lklf"); 

          //System.exit(0); 
          //JFrame test = ScannerUI.frame; 
          //test.dispose(); 
          // p = false; 
          System.out.println ("asdfasfas"); 

          System.exit(frame.dispose()); 
         } 
        });   
+3

爲什麼假設「沒有辦法直接訪問JFrame」?可能最好的解決方案是編寫代碼,使其功能完整。例如,讓持有JFrame的類成爲其他類可調用的公共方法的類來更改其包含的組件的行爲,例如關閉JFrame。爲獲得更好的幫助,請顯示相關的代碼。那麼也許我們可以幫你提供具體的答案。此外,也許更好的解決方案是不打開和關閉窗口,但直到我們看到你的代碼,我們只能猜測。 –

+0

你只是想從代碼,而不是從UI做到這一點,正確嗎? –

+5

錯誤,窗口和JFrame是一樣的東西。郵政編碼,如果你需要幫助。併發布異常的完整堆棧跟蹤。不要認爲某些事情是不可能的,或者只是因爲你的代碼有bug而必須解決。 –

回答

2

你可以使用SwingUtilities的方法,與getWindowAncestor,幫助你拿到按鈕的窗口,然後打電話處理:

btnBack.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     AbstractButton button = (AbstractButton) e.getSource(); 
     Window window = SwingUtilities.getWindowAncestor(button); 
     window.dispose(); 
    } 
}); 

Ano它的選項是獲取當前類的封閉對象(如果它是JFrame的話)。您可以通過使用類名,經過一段時間,隨後這從您的匿名內部類中得到這個,或者你:ScannerUI.this

btnBack.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     ScannerUI.this.dispose(); 
    } 
}); 
+0

非常感謝。 – user2945412

+0

@ user2945412:非常歡迎您! –

+1

+1,用於不依賴於實例變量的泛型代碼。我喜歡第一種方法,因爲那樣你就可以創建一個可以被任何類使用的通用Action。 @ user2945412,SwingUtilities還有其他一些有趣的方法。 – camickr

1

您還可以檢查出Closing an Application並使用ExitAction。這是一個更通用的解決方案,它將模擬用戶單擊窗口上的「X」。在這種情況下,在窗口關閉之前,您已添加到框架的任何WindowsListeners將首先被調用。

可能不適用於這種情況,但只是需要思考。