JFileChooser из программы командной строки и появляется под всеми окнами

Ive реализовал 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 ответов


поэтому, попробовав различные вещи из разных тем переполнения стека, я получил результат, который последовательно и надежно открывается над каждым окном в 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();

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

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

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

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

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

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

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

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


в моем коде, я могу просто использовать 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();
 }
}