Я пишу программу из класса и пытаюсь настроить ее так, чтобы было создано окно, в котором отображаются результаты поиска в виде кнопок. Мне бы хотелось, чтобы при отсутствии результатов поиска в этом окне вызывалось бы всплывающее предупреждение с указанием такого, а затем просто закрывалось окно.
У меня настроено, что всякий раз, когда я хочу закрыть окно, я вызываю метод CloseWindow (), который просто содержит this.dispose (); команда. Если я вызываю его из метода actionEvent после нажатия кнопки, окно закрывается нормально, но если я попытаюсь вызвать его почти где-нибудь еще в методе, оно не закроет окно. Есть ли какая-то базовая концепция Java, которую мне не хватает? Я знаю, что JFrame имеет метод dispose из класса Window, но, похоже, «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, но не откуда-либо еще. [Я вставил его в другие места только для проверки, и он достигнут, но он все еще не закрывает окно.]
Как видите, я поместил println в метод CloseWindow (), чтобы убедиться, что он был достигнут, и он достигается каждый раз, он просто не работает.
Любое понимание этого было бы очень признательно. Спасибо за ваше время.