클래스에서 프로그램을 작성하고 있으며이를 설정하여 단추 형태로 검색 결과를 보여주는 창이 생성되도록 시도하고 있습니다. 검색 결과가 없으면 창에 팝업 경고가 표시되고 창이 닫히는 것이 좋을 것입니다.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을 넣어서 도달 할 때마다 도달하며, 단지 작동하지 않습니다.
이것에 대한 통찰력은 매우 높이 평가 될 것입니다. 시간 내 주셔서 감사합니다.
MovieSearch 객체를 구성하는 코드 *에서 *와 * 어디에서 호출됩니까? 대개 스윙 메서드와 같은 dipose() 메서드는 이벤트 처리기 스레드에서 호출해야합니다.이 스레드는 사실 특별한 작업을 수행하지 않는 한 일반적으로 이벤트 처리기에서 발생합니다. 그리고 보통, 당신은 창을 보여준 후에 (만약 당신이 전혀 보여 주면) * 처분 할 것을 기대할 것입니다, 그러나 나는 당신이이 일을하는 곳을 보지 못합니다. N.B. 프로그램 흐름의 관점에서 볼 때 생성자 내부에서 대화 상자를 여는 것은 다소 이상한 설계입니다. –