JFileChooser如何返回退出值? [英] How does JFileChooser return the exit value?

查看:129
本文介绍了JFileChooser如何返回退出值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 JFileChooser 的典型方法包括检查用户是否点击了OK,如下代码所示:

A typical way to use JFileChooser includes checking whether user clicked OK, like in this code:

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或取消而不冻结表单/对话框窗口。

I tried to mimic this behavior in my own window inheriting JFrame. I thought that this way of handling forms is more convenient than passing collection that is to be edited to the new form. But I have realized that if I want to have a method in my JFrame returning something like exit status of it I need to make it wait for user clicking OK or Cancel without freezing the form/dialog window.

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

So, how does showOpenDialog() work? When I tried to inspect the implementation, I found only one line methods with note "Compiled code".

推荐答案


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

I tried to mimic this behavior in my own window inheriting JFrame.

JFrame 不是模态或阻塞组件。请使用模态 JDialog JOptionPane

JFrame is not a modal or 'blocking' component. Use a modal JDialog or JOptionPane instead.

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);
            }
        });
    }
}

这篇关于JFileChooser如何返回退出值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆