Java this.dispose не закрывает окно при вызове - PullRequest
0 голосов
/ 01 марта 2010

Я пишу программу из класса и пытаюсь настроить ее так, чтобы было создано окно, в котором отображаются результаты поиска в виде кнопок. Мне бы хотелось, чтобы при отсутствии результатов поиска в этом окне вызывалось бы всплывающее предупреждение с указанием такого, а затем просто закрывалось окно.

У меня настроено, что всякий раз, когда я хочу закрыть окно, я вызываю метод 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 (), чтобы убедиться, что он был достигнут, и он достигается каждый раз, он просто не работает.

Любое понимание этого было бы очень признательно. Спасибо за ваше время.

1 Ответ

2 голосов
/ 01 марта 2010

JOptionPane создает «модальный диалог», который означает, что операторы после «showMessageDialog» не будут выполняться до тех пор, пока диалог не будет закрыт.

У вас есть два варианта:

а) создайте свой собственный "немодальный диалог", который отображает ваше сообщение и затем закрывается. б) Прочитать API JOptionPane. В нем показано, как вручную получить доступ к диалоговому окну, созданному классом JOptionPane, чтобы у вас была ссылка на диалоговое окно.

В обоих случаях вам потребуется запустить таймер Swing, прежде чем отобразить диалоговое окно. Затем, когда Таймер сработает, вы можете закрыть диалоговое окно.

...