2014-02-18 69 views
0

我正在嘗試將JFileChooser添加到JPanel。有時它可以正常工作,有時只顯示沒有JFileChooser對話框的JPanel。現在我實際上不知道該怎麼做。任何人都可以幫助我嗎?java GUI中的JFileChooser問題

這裏是我的代碼(這是一種方法):

public File chooseFileFromComputer(){ 

    methodPanel = new JPanel(); 
    methodPanel.setLayout(null); 


    methodFrame = new JFrame(); 
    methodFrame.setTitle("File Chooser"); 
    methodFrame.setVisible(true); 

    BufferedImage removeJavaImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); 
    methodFrame.setIconImage(removeJavaImage); 

    methodLabel = new JLabel("Choose a file: "); 
    methodLabel.setBounds(10, 10, 80, 20); 
    methodPanel.add(methodLabel); 

    fileChooser = new JFileChooser(); 
    fileChooser.setMultiSelectionEnabled(false); 
    fileChooser.setBounds(10, 35, 550, 500); 
    fileChooser.setVisible(true); 
    add(fileChooser); 
     /** 
    * Action Events             #********AE*******# 
    **/ 

    fileChooser.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent actionEvent) { 
      String command = actionEvent.getActionCommand(); 
     if (command.equals(JFileChooser.APPROVE_SELECTION)) { 
      selectedFile = fileChooser.getSelectedFile(); 
      methodFrame.setVisible(false);  
     } else if (command.equals(JFileChooser.CANCEL_SELECTION)) { 
      methodFrame.setVisible(false); 
     } 
     } 
    }); 

    //End of Action Events            #________AE_______# 


    methodPanel.add(fileChooser); 
    methodFrame.setContentPane(methodPanel); 
    methodFrame.setResizable(false); 
    methodFrame.setSize(600, 600); 
    methodFrame.setDefaultCloseOperation(EXIT_ON_CLOSE); 

    return selectedFile; 
} 
+0

見編輯回答。 –

+0

請參閱第二編輯回答。我很害怕在這裏挑選很多。 –

回答

3
  1. 您使用的是空的佈局,並呼籲您的組件setBounds(...)。雖然這對新手來說可能是創建複雜GUI的更好方法,但這是一個謬誤,您創建Swing GUI的次數越多,您越能學會尊重和使用佈局管理器,並發現這些生物能夠極大地幫助您創建靈活,美觀且如果需要是複雜的GUI。
  2. 將您的組件添加到JFrame,然後在JFrame上調用setVisible(true)
  3. 如果您將它設置爲可見和不可見,它看起來不像應該使用JFrame。也許你真的想要使用JDialog,甚至是獨立的JFileChooser對話框。

編輯
你加入JFileChooser,以超過一個容器:

add(fileChooser); // ******************* here ************* 

    fileChooser.addActionListener(new ActionListener(){ 
     private File selectedFile; 

    public void actionPerformed(ActionEvent actionEvent) { 
      String command = actionEvent.getActionCommand(); 
     if (command.equals(JFileChooser.APPROVE_SELECTION)) { 
     selectedFile = fileChooser.getSelectedFile(); 
     methodFrame.setVisible(false);  
     } else if (command.equals(JFileChooser.CANCEL_SELECTION)) { 
      methodFrame.setVisible(false); 
     } 
    } 
    }); 

    methodPanel.add(fileChooser); // ******** here ******* 

你不能做到這一點。只添加到一個容器,否則它可能無法正確顯示或顯示。


編輯2

你回來從你的方法錯誤的結果。您返回selectedFile變量,但是在它被設置之前這樣做,因爲它是由ActionListener設置的,在此方法返回之後,它被稱爲long

解決方案:再次,不要在這裏使用JFrame,其中模態JDialog會更好。如果您使用了模式對話框,並在之後返回,則ActionListener完成後,您的代碼將會工作。


編輯3
但同樣我的錢,我只是用一個JFileChooser一個模式對話框。例如:

JFileChooser fileChooser = new JFileChooser(); 
    fileChooser.setDialogTitle("Choose a File"); 

    // don't use null in the method below but rather a reference to your current GUI 
    int response = fileChooser.showOpenDialog(null); 
    if (response == JFileChooser.APPROVE_OPTION) { 
    File file = fileChooser.getSelectedFile(); 
    System.out.println(file); 
    } 
0

你的JPanel - methodPanel都是空的佈局methodPanel.setLayout(null);嘗試用例如與FlowLayout

0

我並不確切地知道你的類wherether擴展JPanel或沒有,但你應該添加文件選擇到methodPanel和label一起使用。除了actionPerform,我測試了你的代碼。

methodPanel.add(fielChooser); 

我建議,試試吧。