JFileChooser из программы командной строки и появляется под всеми окнами - PullRequest
8 голосов
/ 21 сентября 2011

Я реализовал jFileChooser в моей программе командной строки, и он работает, как и должно быть, только с одной раздражающей проблемой.Кажется, что он открывается под каждым окном без какого-либо предупреждения.На самом деле, я даже несколько раз пропустил это, поначалу заставляя меня поверить, что я это неправильно реализовал.

Я реализовал это следующим образом:

System.out.println("Please select the file");
JFileChooser fc = new JFileChooser();
int retValue = fc.showOpenDialog(new JPanel());
if(retValue == JFileChooser.APPROVE_OPTION){
    g.inputFile = fc.getSelectedFile();
}else {
    System.out.println("Next time select a file.");
    System.exit(1);
}

По сути, я хочу толькоjFileChooser, чтобы пользователь выбрал файл в качестве входного файла.Это единственный компонент, который нуждается в реализации GUI, поэтому, если я могу избежать написания GUI, это будет полезно.

Ответы [ 3 ]

11 голосов
/ 24 сентября 2011

Таким образом, после того, как я попробовал множество вещей из разных тем о переполнении стека, я получил результат, который последовательно и надежно открывается над каждым окном в Windows 7.

public class ChooseFile {
    private JFrame frame;
    public ChooseFile() {
        frame = new JFrame();

        frame.setVisible(true);
        BringToFront();
    }
    public File getFile() {
        JFileChooser fc = new JFileChooser();
        if(JFileChooser.APPROVE_OPTION == fc.showOpenDialog(null)){
            frame.setVisible(false);
            return fc.getSelectedFile();
        }else {
            System.out.println("Next time select a file.");
            System.exit(1);
        }
        return null;
    }

    private void BringToFront() {                  
                    frame.setExtendedState(JFrame.ICONIFIED);
            frame.setExtendedState(JFrame.NORMAL);

    }

}

В моей программе это внутренний класс, который вызывается с помощью вызова:

System.out.println("Please select the file");
g.inputFile = g.new ChooseFile().getFile();
4 голосов
/ 21 сентября 2011

Я думаю о двух возможных причинах чего-то подобного:

  • Вы пытаетесь смешать AWT и Swing GUI в одной программе или
  • Вы пытаетесь смешать консольную программу (то есть, используя System.out.println (...) и получать ввод через объект Scanner) с графическим интерфейсом Swing.

Если вы делаете одну из этих двух вещей, то вам следует упростить и сделать ее только программой типа Swing GUI. Если эта информация не помогает, вы можете сообщить нам больше информации о своей проблеме.

Редактировать 1
Я только что заметил детали вашего кода. Новая часть JPanel () ниже является проблемой:

int retValue = fc.showOpenDialog(new JPanel());

Чтобы JFileChooser действовал как диалоговое окно к окну вашего верхнего уровня (которое в данный момент не выполняется и является вашей главной проблемой), вместо этого вы должны передать компонент, находящийся в родительском верхнем уровне. окно, такое как JPanel или JButton, которое содержится внутри вашего JFrame или JApplet.

Редактировать 2
Хорошо, вы пытаетесь смешать консольную программу на Java с программой Swing GUI, которая похожа на еду мороженого с солеными огурцами - они просто не подходят друг другу. Нет окна верхнего уровня, которое можно было бы предложить методу showOpenDialog в JFileChooser, чтобы оно действовало как настоящий диалог.

Лучшее решение - не делать этого, а вместо этого переписать приложение, чтобы оно представляло собой полноценный Swing GUI.

3 голосов
/ 30 марта 2014

В моем коде я могу просто использовать null, и это работает.Я использую Java 7 на Windows 7.

JFileChooser chooser = new JFileChooser(System.getProperty("java.class.path"));
FileNameExtensionFilter filter = new FileNameExtensionFilter("CSV files", "csv");
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) {
 try {
  Scanner inputFile= new Scanner(new File(chooser.getSelectedFile().getAbsolutePath()));
 } catch (FileNotFoundException e) {
  e.printStackTrace();
 }
}
...