2013-07-25 99 views
0

我正在開發一個需要使用jFileChooser Swing窗口的項目。 單擊「取消」或「打開」時窗口不會關閉。 在查看StackOverflow上的許多帖子並查看JFileChooser tutorial和後,我不知道是什麼導致了這個重複問題。JFileChooser不能正確關閉

我正在與NetBeans一起使用它的swing編輯器。我也嘗試了Eclipse中的程序作爲測試,並獲得了相同的結果。

新更新:

這裏是我的代碼的SSCCE版本嘗試,感謝您的耐心:

//package imi_test; 

import java.io.*; 
import java.io.IOException; 
import javax.swing.*; 


public class FileSelector extends JFrame { 

    //private static BufferedWriter out; 
    //private static FileInputStream in; 
    private static String selPath; 
    private int val; 
    //private static UniqueReader2 ur; 



    public FileSelector() throws IOException { 

     initComponents();   
    } 

    public static String getSelPath(){ 
     return selPath; 
    } 



     public static void writeNewPath(String path) throws IOException{ 
     //This would write the selected folder's new unique file path to a file 
      System.out.println("New file path written"); 
     /* 
     out = new BufferedWriter(new FileWriter("recentPaths.txt",true)); 
     in = new FileInputStream("recentPaths.txt"); 
     ur = new UniqueReader(new InputStreamReader(in)); 
     ur.main(null); 
     try{ 


      if(ur.linePres){ 

      }else{ 

       out.write(path); 
       out.newLine(); 
       out.flush(); 
       out.close(); 

       FileChecker.setFilePath(path); 
      }    
     }catch(Exception e){System.err.println(e);} 
*/ 
    } 
//******************************************************* 
    //Netbeans auto gen GUI code starts here  

    @SuppressWarnings("unchecked") 

    private void initComponents() { 

     jDialog1 = new javax.swing.JDialog(); 
     jMenuItem1 = new javax.swing.JMenuItem(); 
     jFrame1 = new javax.swing.JFrame(); 

     folderSelector = new javax.swing.JFileChooser(); 

     javax.swing.GroupLayout jDialog1Layout = new javax.swing.GroupLayout(jDialog1.getContentPane()); 
     jDialog1.getContentPane().setLayout(jDialog1Layout); 
     jDialog1Layout.setHorizontalGroup(
      jDialog1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 400, Short.MAX_VALUE) 
     ); 
     jDialog1Layout.setVerticalGroup(
      jDialog1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 300, Short.MAX_VALUE) 
     ); 

     jMenuItem1.setText("jMenuItem1"); 

     javax.swing.GroupLayout jFrame1Layout = new javax.swing.GroupLayout(jFrame1.getContentPane()); 
     jFrame1.getContentPane().setLayout(jFrame1Layout); 
     jFrame1Layout.setHorizontalGroup(
      jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 400, Short.MAX_VALUE) 
     ); 
     jFrame1Layout.setVerticalGroup(
      jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 300, Short.MAX_VALUE) 
     ); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     folderSelector.setCurrentDirectory(new java.io.File("Computer")); 
     folderSelector.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
     folderSelector.setAcceptAllFileFilterUsed(false); 
     folderSelector.setDialogTitle("Please Select a Folder"); 
     val = folderSelector.showOpenDialog(FileSelector.this); 
     folderSelector.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       folderSelectorActionPerformed(evt); 
      } 
     }); 


     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(folderSelector, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(folderSelector, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
     ); 

     pack(); 
    }       


    //Netbeans auto gen GUI code ends here 
//******************************************************* 

    private void folderSelectorActionPerformed(java.awt.event.ActionEvent evt) {            


     if (val== JFileChooser.APPROVE_OPTION) { 
      try{ 
       selPath = folderSelector.getSelectedFile().getPath(); 
       writeNewPath(selPath); 
       this.dispose(); 

      }catch(Exception ex){System.err.println(ex.getMessage() + "After folder selection");} 
     } 
     else{ 
      selPath = null; 
      this.dispose();  
     } 
    }            


    public static void main(String args[]) { 

     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (Exception ex) { 
      java.util.logging.Logger.getLogger(FileSelector.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     }    

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try{ 
        new FileSelector().setVisible(true); 
       }catch(Exception e){System.err.println(e.getMessage());} 
      } 
     }); 
    } 
    // Variables declaration - do not modify      
    private javax.swing.JFileChooser folderSelector; 
    private javax.swing.JDialog jDialog1; 
    private javax.swing.JFrame jFrame1; 
    private javax.swing.JMenuItem jMenuItem1; 
    // End of variables declaration     
} 

感謝您的時間和幫助解決這個問題。

SOLUTION: 從NetBeans的放在文件清理掉多餘的東西后,的JDialog,JFrame,然後JMenuItem的,它的工作原理是應該的方式。

+1

想要得到更快的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+0

@AndrewThompson這是否符合SSCCE標準?另外,你有什麼想法可以解決這個問題嗎? – Jon

回答

2

我不認爲你應該增加一個ActionListenerJFileChooser,這很可能(基於你的代碼)每次你嘗試關閉它時都會打開一個新的對話框。

相反,你應該簡單地打開直接對話..

folderSelector = new JFileChooser(file); 
folderSelector.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
folderSelector.setAcceptAllFileFilterUsed(false); 
folderSelector.setDialogTitle("Please Select a Folder"); 

int val = folderSelector.showOpenDialog(folderSelector.this); 
if (val== JFileChooser.APPROVE_OPTION) { 
    selPath = folderSelector.getSelectedFile().getPath(); 
} 

這將顯示一個對話框,這將導致程序運行在這一點上,直到對話框停止關閉,然後你就可以驗證什麼已被選中

+0

首先,感謝您的回覆。 我剛剛嘗試了您的建議,並且有所幫助。 現在,當我點擊取消,打開或「x」時,窗口關閉並重新出現在屏幕的左上角。重新出現後,打開和取消按鈕不再響應,儘管在窗口文件夾導航仍然有效。 – Jon

+0

@ user2616684您是否有可運行的示例來演示您的問題。這聽起來像你的問題是在哪裏 – MadProgrammer

+0

是的,我有一個獨立的可運行的例子,但該文件是相當大的。我可以將文件代碼發佈爲我的問題的編輯,除非您希望我將文件發送給您。 此外,我更新了文件,當點擊'打開','取消'或'X'時,框架消失,然後重新出現在屏幕的左上角,沒有標題。好消息是,它現在只做了一次,壞消息是它沒有按照它應該做的那樣做,直到在第二幀被關閉之後,第一幀與第一幀相同。 – Jon

1

這裏的主要問題是文件選擇器正在被添加到框架!我'一天的學習項目'是,這甚至可能是

import java.io.*; 
import java.io.IOException; 
import javax.swing.*; 

public class FileSelector extends JFrame { 

    private static String selPath; 
    private int val; 

    public FileSelector() throws IOException { 

     initComponents(); 
    } 

    public static String getSelPath(){ 
     return selPath; 
    } 

    public static void writeNewPath(String path) throws IOException{ 
     //This would write the selected folder's new unique file path to a file 
     System.out.println("New file path written"); 
    } 

    private void initComponents() { 

     jDialog1 = new javax.swing.JDialog(); 
     jMenuItem1 = new javax.swing.JMenuItem(); 
     jFrame1 = new javax.swing.JFrame(); 

     folderSelector = new javax.swing.JFileChooser(); 

     javax.swing.GroupLayout jDialog1Layout = new javax.swing.GroupLayout(jDialog1.getContentPane()); 
     jDialog1.getContentPane().setLayout(jDialog1Layout); 
     jDialog1Layout.setHorizontalGroup(
      jDialog1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 400, Short.MAX_VALUE) 
     ); 
     jDialog1Layout.setVerticalGroup(
      jDialog1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 300, Short.MAX_VALUE) 
     ); 

     jMenuItem1.setText("jMenuItem1"); 

     javax.swing.GroupLayout jFrame1Layout = new javax.swing.GroupLayout(jFrame1.getContentPane()); 
     jFrame1.getContentPane().setLayout(jFrame1Layout); 
     jFrame1Layout.setHorizontalGroup(
      jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 400, Short.MAX_VALUE) 
     ); 
     jFrame1Layout.setVerticalGroup(
      jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGap(0, 300, Short.MAX_VALUE) 
     ); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     folderSelector.setCurrentDirectory(new java.io.File("Computer")); 
     folderSelector.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
     folderSelector.setAcceptAllFileFilterUsed(false); 
     folderSelector.setDialogTitle("Please Select a Folder"); 
     val = folderSelector.showOpenDialog(FileSelector.this); 

     pack(); 
    } 

    public static void main(String args[]) { 
     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try{ 
        new FileSelector().setVisible(true); 
       }catch(Exception e){System.err.println(e.getMessage());} 
      } 
     }); 
    } 

    private javax.swing.JFileChooser folderSelector; 
    private javax.swing.JDialog jDialog1; 
    private javax.swing.JFrame jFrame1; 
    private javax.swing.JMenuItem jMenuItem1; 
} 
+0

唯一的區別是上面的代碼爲我生成,如果它對你工作正常,那麼我有一個不同的問題,是彈出的第二個框架是你剛剛製作一個空框架時的空迷你框架之一。 – Jon

+0

作品!一旦我清除了所有額外的東西netbeans放在它的工作就像它應該。 – Jon

+0

很高興你把它分類。如果它有助於解決問題,請[接受](http://meta.stackexchange.com/a/65088/155831)答案。 :)至於Netbeans ..我通常建議新程序員避免IDE提供的大部分內容。在Netbeans的情況下,尤其是GUI設計者。問題是,在有可能有效地使用GUI設計器之前,您需要了解如何構建GUI。 –