2013-07-25 2 views
0

jFileChooser 스윙 창을 사용해야하는 프로젝트에서 작업하고 있습니다. "취소"또는 "열기"를 클릭하면 창이 닫히지 않습니다. 여기 StackOverflow에서 여러 개의 게시물을보고 JFileChooser tutorialdocumentation을 보면이 반복되는 문제의 원인을 놓치고 있습니다.JFileChooser가 올바르게 닫히지 않습니다.

NetBeans와 함께 스윙 편집기를 사용하고 있습니다. 나는 또한 이클립스에서이 프로그램을 테스트 해 본 결과 동일한 결과를 얻었다.

새로운 업데이트 :

여기에 코드의 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     
} 

이 시간 내 주셔서 감사하고이 문제에 도움이됩니다.

해결책 : 넣어 넷빈즈 파일에서 여분의 물건을 삭제 한 후, (살) 가지는 JDialog, JFrame, 및 JMenuItem를, 그것은이에 가정되는 방식으로 작동합니다.

+1

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+0

@AndrewThompson 이것이 SSCCE 표준을 충족합니까? 또한이 문제를 해결할 수있는 방법에 대한 아이디어가 있습니까? – Jon

답변

2

JFileChooserActionListener을 추가해야한다고 생각하지 않습니다.이 코드는 사용자의 코드에 따라 시도하고 닫을 때마다 새 대화 상자를 열 수 있습니다. 이 대화 할 때까지이 시점에서 중단 할 수있는 프로그램의 실행을 야기하는 대화 상자를 표시합니다

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를 작성하는 방법을 이해해야한다는 것입니다. –

관련 문제