Как JFileChooser возвращает значение выхода? - PullRequest
2 голосов
/ 10 августа 2011

Типичный способ использования JFileChooser включает проверку, нажал ли пользователь OK, как в следующем коде:

private void addModelButtonMouseClicked(java.awt.event.MouseEvent evt) {                                            
    JFileChooser modelChooser = new JFileChooser();
    if(modelChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION ){
        File selectedFile = modelChooser.getSelectedFile();
        if(verifyModelFile(selectedFile)){
            MetModel newModel;
            newModel = parser.parse(selectedFile, editedCollection.getDirectory() );
            this.editedCollection.addModel(newModel);
            this.modelListUpdate();
        }
    }
}

Я пытался имитировать это поведение в своем собственном окне, наследующем JFrame.Я думал, что такой способ обработки форм более удобен, чем передача коллекции, которая должна быть отредактирована до новой формы.Но я понял, что если я хочу, чтобы в моем JFrame был метод, возвращающий что-то вроде его состояния выхода, мне нужно подождать, пока пользователь нажмет OK или Отмена, не останавливая окно формы / диалога.

Итак, как работает showOpenDialog()?Когда я попытался проверить реализацию, я нашел только одну строку методов с пометкой «Скомпилированный код».

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Я пытался имитировать это поведение в своем собственном окне, наследующем JFrame.

JFrame не является модальным или «блокирующим» компонентом.Вместо этого используйте модальный JDialog или JOptionPane.

EG

Blocking Chooser

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

/**  Typical output:
[JTree, colors, violet]
User cancelled
[JTree, food, bananas]
Press any key to continue . . .
*/
class ConfirmDialog extends JDialog {

    public static final int OK_OPTION = 0;
    public static final int CANCEL_OPTION = 1;

    private int result = -1;

    JPanel content;

    public ConfirmDialog(Frame parent) {
        super(parent,true);

        JPanel gui = new JPanel(new BorderLayout(3,3));
        gui.setBorder(new EmptyBorder(5,5,5,5));
        content = new JPanel(new BorderLayout());
        gui.add(content, BorderLayout.CENTER);
        JPanel buttons = new JPanel(new FlowLayout(4));
        gui.add(buttons, BorderLayout.SOUTH);

        JButton ok = new JButton("OK");
        buttons.add(ok);
        ok.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent ae) {
                result = OK_OPTION;
                setVisible(false);
            }
        });

        JButton cancel = new JButton("Cancel");
        buttons.add(cancel);
        cancel.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent ae) {
                result = CANCEL_OPTION;
                setVisible(false);
            }
        });

        setContentPane(gui);
    }

    public int showConfirmDialog(JComponent child, String title) {
        setTitle(title);
        content.removeAll();
        content.add(child, BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(getParent());

        setVisible(true);

        return result;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new JFrame("Test ConfirmDialog");
                final ConfirmDialog dialog = new ConfirmDialog(f);
                final JTree tree = new JTree();
                tree.setVisibleRowCount(5);
                final JScrollPane treeScroll = new JScrollPane(tree);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JButton b = new JButton("Choose Tree Item");
                b.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent ae) {
                        int result = dialog.showConfirmDialog(
                            treeScroll, "Choose an item");
                        if (result==ConfirmDialog.OK_OPTION) {
                            System.out.println(tree.getSelectionPath());
                        } else {
                            System.out.println("User cancelled");
                        }
                    }
                });
                JPanel p = new JPanel(new BorderLayout());
                p.add(b);
                p.setBorder(new EmptyBorder(50,50,50,50));
                f.setContentPane(p);
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        });
    }
}
1 голос
/ 10 августа 2011

Полагаю, вы ждете, пока пользователь нажмет какую-то кнопку, постоянно проверяя, какая кнопка нажата.

"Мне нужно, чтобы пользователь дождался нажатия кнопки ОК или Отмена, не останавливая окно формы / диалога".

Может быть, вам следует использовать четные уведомления, когда пользователь нажимает на что-то, а не ждет, пока он нажмет кнопку - может быть, есть какое-то событие OnWindowExit?

Или может быть что-то подобное:

 MyPanel panel = new MyPanel(...);  
 int answer = JOptionPane.showConfirmDialog(  
 parentComponent, panel, title, JOptionPane.YES_NO_CANCEL,  
 JOptionPane.PLAIN_MESSAGE  );  
 if (answer == JOptionPane.YES_OPTION)  
      {  
         // do stuff with the panel  
      } 

В противном случае вы можете увидеть, как обрабатывать события окна, особенно windowClosing(WindowEvent) здесь

...