JFileChooser如何返回退出值?

时间:2011-08-10 10:18:03

标签: java swing listener jfilechooser

使用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中返回一个类似于退出状态的方法,我需要让它等待用户单击“确定”或“取消”而不冻结表单/对话框窗口。

那么showOpenDialog()如何运作?当我尝试检查实现时,我发现只有一行注释“编译代码”。

2 个答案:

答案 0 :(得分:2)

  

我试图在继承JFrame的自己的窗口中模仿这种行为。

JFrame不是模态或“阻止”组件。请改用模态JDialogJOptionPane

E.G。

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 :(得分:1)

我猜你等着用户点击某个按钮,不断检查按下了什么按钮。

“我需要让它等待用户单击”确定“或”取消“而不冻结表单/对话框窗口。”

可能你应该使用evens来获取通知,当用户点击某些内容,而不是等待他们按下按钮时 - 可能有一些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) here