从命令行程序中调用JFileChooser并在所有窗口下方弹出

9

我在我的命令行程序中实现了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,那将非常有帮助。


请参见我下面回答中的编辑2 - Hovercraft Full Of Eels
这个线程可能会有所帮助:https://dev59.com/22435IYBdhLWcg3w7kwK - Daniel Ryan
3个回答

12

在尝试了多个Stack Overflow主题中的各种方法后,我最终得到的结果是,在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();

这对我帮助很大。在使用JFileChooser之前,仅使用这5行代码就解决了所有问题:final JFrame jFrame; jFrame = new JFrame(); jFrame.setVisible(true); jFrame.setExtendedState(JFrame.ICONIFIED); jFrame.setExtendedState(JFrame.NORMAL); - A.M.
我实际上在这里寻找一个更简单的解决方案(没有JFrame):http://stackoverflow.com/questions/17438630/how-to-generate-a-stand-alone-jfilechooser-dialog-box-on-top-of-other-windows ...但看起来我不太可能得到像这个一样易于实现的答案。 - A.M.
非常感谢您的帮助!我根据自己的需求进行了定制!它真的很有效! - Randika Vishman

4
我认为这种情况可能有两个原因:
  • 您正在尝试在同一程序中混合使用AWT和Swing GUI;
  • 您正在尝试将控制台程序(即使用System.out.println(...)并通过Scanner对象获取输入)与Swing GUI混合使用。
如果您正在执行上述任何一项操作,则应简化并仅创建一个Swing GUI类型的程序。如果这些信息无法帮助您解决问题,则可能需要提供更多关于您问题的信息。 编辑1
我刚刚注意到您代码的细节。下面的new JPanel()部分是一个问题:
int retValue = fc.showOpenDialog(new JPanel());

为了让JFileChooser作为您顶层窗口的对话框(它目前没有这样做,这是您的主要问题),您应该传递一个在父级顶层窗口中的组件,例如在您的JFrame或JApplet中包含的JPanel或JButton。 编辑2 好的,您正在尝试将Java控制台程序与Swing GUI程序混合在一起,就像用泡菜吃冰淇淋一样-它们不搭配。没有顶级窗口可以提供给JFileChooser的showOpenDialog方法,以便它可以充当真正的对话框。
最好的解决方案是不要这样做,而是重新编写您的应用程序成为完整的Swing GUI。

3

在我的代码中,我只能使用null并且它起作用。我正在使用Windows 7上的Java 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();
 }
}

很好的直接回答,没有说教。可以确认上述代码在1.7和1.8中有效。 - Frelling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接