JFileChooser来自命令行程序并弹出所有窗口下方

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

因此,在尝试了来自不同堆栈溢出主题的各种事物后,我最终得到的结果是在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,或者
  • 您正在尝试使用Swing GUI混合控制台程序(即使用System.out.println(…)并通过Scanner对象获取输入)。

如果你正在做这两件事中的任何一件,那么你应该简化并使它只是一个Swing GUI类型的程序。 如果此信息没有帮助,那么您可能希望向我们提供有关您的问题的更多信息。

编辑1
我刚刚注意到你的代码的细节。 下面的新JPanel()部分是一个问题:

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

要使JFileChooser充当顶级窗口的对话框 (它当前没有进行操作,哪个是您的主要问题),您应该传递一个位于父顶级窗口的组件,例如JPanel或JButton保存在JFrame或JApplet中。

编辑2
好吧,你正在尝试将Java控制台程序与Swing GUI程序混合,就像吃泡菜的冰淇淋一样 – 它们只是不能很好地融合在一起。 没有为JFileChooser的showOpenDialog方法提供的顶级窗口,因此它将充当真正的对话框。

最好的解决方案是不要这样做,而是将您的应用程序重新编写为完整的Swing GUI。

在我的代码中,我可以使用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(); } }