【问题标题】:JFileChooser embedded in a JPanel嵌入在 JPanel 中的 JFileChooser
【发布时间】:2010-09-20 13:10:40
【问题描述】:

我正在编写一个需要打开文件对话框的 java 程序。文件打开对话框并不难,我希望使用JFileChooser。我的问题是我想要一个双窗格JFrame(由 2 个JPanels 组成)。左侧面板将有一个JList,右侧面板将有一个文件打开对话框。

当我使用JFileChooser.showOpenDialog() 时,这会打开所有其他窗口上方的对话框,这不是我想要的。有什么方法可以让JFileChooser(或者可能是另一个文件选择对话框)显示在JPanel 中,而不是在其上方弹出?

这是我尝试过的代码,在这一点上它非常简化。此时我只是想让JFileChooser 嵌入到JPanel 中。

public class JFC extends JFrame{
    public JFC()
    {
        setSize(800,600);

        JPanel panel= new JPanel();

        JFileChooser chooser = new JFileChooser();
        panel.add(chooser);

        setVisible(true);

        chooser.showOpenDialog(null);
    }

    public static void main(String[] args)
    {
        JFC blah = new JFC();
    }
}

我也尝试用thispanel 调用chooser.showOpenDialog,但无济于事。另外,我尝试将JFileChooser 直接添加到框架中。上面列出的两种尝试仍然会在框架或面板前面弹出JFileChooser(取决于我将JFileChooser 添加到哪个位置)。

【问题讨论】:

    标签: java jpanel jfilechooser fileopendialog


    【解决方案1】:

    JFileChooser 扩展了 JComponent 和 Component,因此您应该能够将其直接添加到您的框架中。

    JFileChooser fc = ...
    JPanel panel ...
    panel.add(fc);
    

    【讨论】:

      【解决方案2】:

      如果您要即时添加 JFileChooser,则需要调用 revalidate()。

      史蒂夫的回答是正确的。您可以将 JFileChooser 添加到其他容器中。

      【讨论】:

        【解决方案3】:

        要访问文件选择器中的“按钮”,您必须向其中添加一个 ActionListener:

        fileChooser.addActionListener(this);
        [...]
        
        public void actionPerformed(ActionEvent action)
        {
            if (action.getActionCommand().equals("CancelSelection"))
            {
                System.out.printf("CancelSelection\n");
                this.setVisible(false);
                this.dispose();
            }
            if (action.getActionCommand().equals("ApproveSelection"))
            {
                System.out.printf("ApproveSelection\n");
                this.setVisible(false);
                this.dispose();
            }
        }
        

        【讨论】:

          【解决方案4】:

          致 Johannes:感谢您提供有用的 sn-p。

          我使用定义的常量 JFileChooser.APPROVE_SELECTIONJFileChooser.CANCEL_SELECTION 而不是“ApproveSelection”和“CancelSelection”

          【讨论】:

            猜你喜欢
            • 2019-12-22
            • 1970-01-01
            • 1970-01-01
            • 2011-10-07
            • 1970-01-01
            • 2013-06-17
            • 1970-01-01
            • 2011-06-16
            • 2016-10-09
            相关资源
            最近更新 更多