2010-03-01 2 views
0

클래스에서 프로그램을 작성하고 있으며이를 설정하여 단추 형태로 검색 결과를 보여주는 창이 생성되도록 시도하고 있습니다. 검색 결과가 없으면 창에 팝업 경고가 표시되고 창이 닫히는 것이 좋을 것입니다.Java this.dispose가 호출 될 때 창을 닫지 않습니다.

창을 닫을 때마다 this.dispose()가 포함 된 CloseWindow() 메서드를 호출합니다. 명령. 일단 버튼이 눌려지면 actionEvent 메소드에서 호출하면 윈도우가 잘 닫히지 만 메서드의 거의 모든 곳에서 호출하려고하면 윈도우가 닫히지 않습니다. 내가 누락 된 기본적인 Java 개념이 있습니까? JFrame은 Window 클래스의 dispose 메서드를 가지고 있지만, "this"는 특정 조건에서만 작동하는 것으로 보입니다.

관련 코드는 아래와 같다 : 다시

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 객체를 구성하는 코드 *에서 *와 * 어디에서 호출됩니까? 대개 스윙 메서드와 같은 dipose() 메서드는 이벤트 처리기 스레드에서 호출해야합니다.이 스레드는 사실 특별한 작업을 수행하지 않는 한 일반적으로 이벤트 처리기에서 발생합니다. 그리고 보통, 당신은 창을 보여준 후에 (만약 당신이 전혀 보여 주면) * 처분 할 것을 기대할 것입니다, 그러나 나는 당신이이 일을하는 곳을 보지 못합니다. N.B. 프로그램 흐름의 관점에서 볼 때 생성자 내부에서 대화 상자를 여는 것은 다소 이상한 설계입니다. –

답변

2

JOptionPane은 "showMessageDialog"다음의 명령문이 대화 상자가 닫힐 때까지 실행되지 않는다는 것을 의미하는 "모달 대화 상자"를 만듭니다.

가) 당신이 닫히고 다음 메시지를 표시하고 사용자 정의 "비 모달 대화 상자를"소유 작성 :

당신은 두 가지 옵션이 있습니다. b) JOptionPane API를 읽습니다. JOptionPane 클래스에 의해 생성 된 대화 상자에 수동으로 액세스하여 대화 상자에 대한 참조를 갖는 방법을 보여줍니다.

두 경우 모두 대화 상자를 표시하기 전에 스윙 타이머를 시작해야합니다. 그런 다음 타이머가 실행되면 대화 상자를 삭제할 수 있습니다.

관련 문제