2011-09-21 41 views
8

我在我的命令行程序中實現了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,那將會有所幫助。

+0

請參閱**編輯2 **在我的答案下面。 –

+0

此線程可能會幫助您:http:// stackoverflow。com/questions/5129294 /自帶jfilechooser-top-of-windows- – Zammbi

回答

10

所以,在嘗試了各種不同的堆棧溢出主題的東西后,我結束了與每個窗口上方的穩定,可靠的打開在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(); 
+0

這對我非常有幫助。在使用JFileChooser之前,在一個塊中只有這5行解決了所有問題:** final JFrame jFrame; jFrame = new JFrame(); jFrame.setVisible(真); jFrame.setExtendedState(JFrame.ICONIFIED); jFrame.setExtendedState(JFrame.NORMAL); ** –

+0

我實際上在這裏尋找更簡單的解決方案(沒有JFrame):http://stackoverflow.com/questions/17438630/how-to-generate-a-stand-alone -jfilechooser-dialog-box-on-top-of-other-windows ...但它看起來不像我會得到任何答案那樣容易實現。 –

+0

感謝您的大力幫助!我根據自己的需求定製它!它確實有效! –

4

我想到兩個可能的原因是這樣的:

  • 你試圖混合AWT和Swing GUI在同一程序,或
  • 你試圖混合控制檯程序(即使用System.out.println(...)並通過Scanner對象獲取輸入)。

如果你正在做這兩件事中的任何一件,那麼你應該簡化它,並使它只是一個Swing GUI類型的程序。如果這些信息沒有幫助,那麼您可能希望向我們提供有關您的問題的更多信息。

編輯1
我只注意到你的代碼的細節。該新JPanel()以下部分爲一個問題:

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

爲了使JFileChooser中充當對話框到您的頂層窗口(它當前不能做什麼,這是你的主要問題),你應該而是傳遞父級頂層窗口中的組件,例如JPanel或JButton,該組件位於JFrame或JApplet中。

編輯2
OK,你想用一個Swing GUI程序,它就像吃冰淇淋與泡菜搭配一個Java控制檯程序 - 他們只是不順利在一起。 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(); 
} 
} 
+0

沒有佈道的好直接答案。可以確認以上代碼在1.7和1.8中工作。 – Frelling

相關問題