2010-03-01 137 views
0

我正在從類寫入一個程序,並且我正在嘗試設置它,因此創建了一個以按鈕形式顯示搜索結果的窗口。如果沒有搜索結果,我希望它會顯示窗口會彈出一個警告消息,然後關閉窗口。我有一個設置,只要我想使窗口關閉,我調用一個CloseWindow()方法,只包含一個this.dispose();命令。如果我在按下按鈕時從actionEvent方法調用它,窗口會關閉,但如果我嘗試在方法的其他任何地方調用它,它將不會關閉窗口。有沒有一些基本的Java概念,我錯過了?我知道JFrame具有Window類中的dispose方法,但「this」似乎只在某些條件下才起作用。Java this.dispose調用時沒有關閉窗口

相關的代碼是下面:

public class MovieSearch extends JFrame implements ActionListener, Serializable{ 

private static final long serialVersionUID = 7526471155622776147L; 

private Container con = getContentPane(); 

int llSize, searchResults = 0; 
MovieNode currentNode; 

String searchText; 

JPanel listPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 

JScrollPane scrollPane = new JScrollPane(listPanel); 

public MovieSearch(String searchText){ 
    super("Search Results"); 

    this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 

    this.searchText = searchText; 

    con.add(scrollPane); 

    currentNode = MovieView.firstNode; 

    for(int i = 0; i < llSize; i++){ 
     if (currentNode.getTitle().indexOf(searchText) != -1) { 

      BufferedImage Thumbnail = new BufferedImage(200, 300, BufferedImage.TYPE_INT_ARGB); 
      Thumbnail.getGraphics().drawImage(currentNode.getImage().getImage(), 0, 0, 200, 300, null); 
      ImageIcon icon = new ImageIcon(Thumbnail); 

      JButton button = new JButton("Go to " + currentNode.getTitle()); 
      button.addActionListener(this); 
      button.setVerticalTextPosition(AbstractButton.BOTTOM); 
      button.setHorizontalTextPosition(AbstractButton.CENTER); 
      button.setIcon(icon); 
      listPanel.add(button); 

      searchResults++; 

      currentNode = currentNode.getLink(); 
     } else { 
      System.out.println("String " + currentNode.getTitle() + " does not contain String " + searchText); 
      currentNode = currentNode.getLink(); 
     } 
    } 

    if(searchResults == 0){ 
     int messageType = JOptionPane.ERROR_MESSAGE; 
     JOptionPane.showMessageDialog(null, "No results match that query.", "NO RESULTS!", messageType); 
     CloseWindow(); 

    }else{ 
     currentNode = MovieView.firstNode; 
     repaint(); 
    } 
} 

public void actionPerformed(ActionEvent e){ 
    Object source = e.getSource(); 

    for(int i = 0; i < llSize; i++){ 
     JButton button; 

     button = (JButton) source; 

     if(button.getText().equals(("Go to " + currentNode.getTitle()))){ 
      MovieView.currentNode = currentNode; 
      MovieView.searchTextField.setText(""); 
      CloseWindow(); 
     } 

     System.out.println("button is " + button.getText()); 
     System.out.println("text is: " + "Go to " + currentNode.getTitle()); 
     currentNode = currentNode.getLink(); 
    } 

} 


private void CloseWindow(){ 
    System.out.println("Closing Window"); 
    this.dispose(); 
} 

}

同樣,CloseWindow()方法[並因此this.dispose()方法]工作稱爲形式時的ActionEvent方法而不是從其他地方。 [我已經將它插入到其他地方進行測試並且已經到達,但它仍然沒有關閉窗口。]

正如您所看到的,我在CloseWindow()方法中放置了一個println以確保它是到達並且每次都到達,它只是不工作。

任何洞察到這一點將不勝感激。感謝您的時間。

+0

在構建MovieSearch對象的代碼* around *中發生了什麼以及它從哪裏調用?通常,你會希望dipose()方法,就像一般的Swing方法一樣,可以從事件派發線程調用,事實上這通常意味着從事件處理程序中除非你做了一些特殊的事情。通常情況下,你會希望在你展示窗口之後處理*(如果你展示的話),但是我不知道你在做什麼。注:從程序流的角度來看,在構造函數中打開一個對話框是一個有點奇怪的設計,我會說。 – 2010-03-01 04:45:39

回答

2

JOptionPane創建一個「模式對話框」,這意味着「showMessageDialog」之後的語句直到對話框關閉之後纔會執行。

你有兩個選擇:

一)創建你自己定製的「非模態對話框」,顯示你的消息,然後關閉。 b)閱讀JOptionPane API。它向您展示瞭如何手動訪問由JOptionPane類創建的對話框,以便您有對該對話框的引用。

在這兩種情況下,您都需要在顯示對話框之前啓動Swing Timer。然後,當Timer觸發時,您可以處理該對話框。