Java this.dispose在调用时不关闭窗口
我正在从类中编写一个程序,并试图将其设置为创建一个以按钮形式显示搜索结果的窗口。我想,如果没有搜索结果,窗口将调用一个弹出式警告,说明这一点,然后关闭窗口 我有一个设置,每当我想关闭窗口时,我调用一个CloseWindow()方法,该方法只包含一个this.dispose();指挥部。如果我在按下按钮后从actionEvent方法调用它,窗口会很好地关闭,但是如果我尝试在方法中的任何其他地方调用它,它都不会关闭窗口。我是否缺少一些基本的Java概念?我知道JFrame具有Window类中的dispose方法,但是“this”似乎只在某些条件下起作用 相关代码如下:Java this.dispose在调用时不关闭窗口,java,swing,dispose,Java,Swing,Dispose,我正在从类中编写一个程序,并试图将其设置为创建一个以按钮形式显示搜索结果的窗口。我想,如果没有搜索结果,窗口将调用一个弹出式警告,说明这一点,然后关闭窗口 我有一个设置,每当我想关闭窗口时,我调用一个CloseWindow()方法,该方法只包含一个this.dispose();指挥部。如果我在按下按钮后从actionEvent方法调用它,窗口会很好地关闭,但是如果我尝试在方法中的任何其他地方调用它,它都不会关闭窗口。我是否缺少一些基本的Java概念?我知道JFrame具有Window类中的dis
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();
}
公共类MovieSearch扩展JFrame实现ActionListener,可序列化{
私有静态最终长serialVersionUID=752647115622776147L;
私有容器con=getContentPane();
int llSize,searchResults=0;
MovieNode电流节点;
字符串搜索文本;
JPanel listPanel=newjpanel(newflowlayout(FlowLayout.RIGHT));
JScrollPane scrollPane=新的JScrollPane(列表面板);
公共电影搜索(字符串搜索文本){
超级(“搜索结果”);
此.setDefaultCloseOperation(在关闭时处理);
this.searchText=searchText;
con.add(滚动窗格);
currentNode=MovieView.firstNode;
对于(int i=0;i
}
同样,CloseWindow()方法[以及this.dispose()方法]在从ActionEvent方法调用时起作用,而不是从其他任何地方调用。[我将其插入其他位置只是为了测试,它已到达,但仍无法关闭窗口。]
如您所见,我在CloseWindow()方法中放置了一个println,以确保它被访问,并且每次都被访问,它只是不起作用
如能对此有所了解,将不胜感激。感谢您的时间。JOptionPane会创建一个“模态对话框”,这意味着“showMessageDialog”后面的语句在对话框关闭之前不会执行
您有两个选择:
a) 创建自己的自定义“非模式对话框”,该对话框显示消息,然后关闭。
b) 阅读JOptionPane API。它向您展示了如何手动访问由JOptionPane类创建的对话框,以便对该对话框进行引用
在这两种情况下,您都需要在显示对话框之前启动Swing计时器。然后,当计时器启动时,您可以处理该对话框。围绕构建MovieSearch对象的位置以及从何处调用该对象,代码中会发生什么?通常,您会期望dipose()方法,就像通常的Swing方法一样,从事件分派线程调用,这实际上通常意味着从事件处理程序调用,除非您做一些特殊的事情。通常情况下,您希望在显示窗口后进行处理(如果您显示了窗口的话),但我不知道您在哪里执行此操作。注意:从程序流的角度来看,在构造函数中打开对话框是一个有点奇怪的设计。