JFileChooser встроен в JPanel - PullRequest
       23

JFileChooser встроен в JPanel

8 голосов
/ 03 ноября 2008

Я пишу 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();
    }
}

Я также пытался дозвониться до chooser.showOpenDialog с this и panel, но безрезультатно. Также я попытался добавить JFileChooser непосредственно в кадр. Обе попытки, перечисленные выше, все еще имеют всплывающее окно JFileChooser перед рамой или панелью (в зависимости от того, к чему я добавляю JFileChooser).

Ответы [ 4 ]

10 голосов
/ 03 ноября 2008

JFileChooser расширяет JComponent и Component, так что вы сможете добавить его непосредственно в ваш фрейм.

JFileChooser fc = ...
JPanel panel ...
panel.add(fc);
5 голосов
/ 05 ноября 2008

Чтобы получить доступ к «кнопкам» в окне выбора файлов, вам нужно добавить к нему 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();
    }
}
3 голосов
/ 03 ноября 2008

Если вы добавляете JFileChooser на лету, вам нужно будет вызвать revalidate ().

Стив ответ правильный. Вы можете добавить JFileChooser в другие контейнеры.

2 голосов
/ 10 сентября 2009

Йоханнесу: спасибо за ваш полезный фрагмент.

Вместо «ApproveSelection» и «CancelSelection» я использовал определенные константы JFileChooser.APPROVE_SELECTION и JFileChooser.CANCEL_SELECTION

...