1

jFileChooser Swing ウィンドウを使用する必要があるプロジェクトに取り組んでいます。「キャンセル」または「開く」をクリックしても、ウィンドウが閉じません。ここで StackOverflow に関する多数の投稿を表示し、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                   
}

お時間をいただきありがとうございます。この問題を解決してください。

解決策: netbeans が入れたファイル、jDialog、JFrame、および jMenuItem から余分なものを削除した後、想定どおりに動作します。

4

2 に答える 2

3

ActionListenerに を追加する必要はないと思いますJFileChooser。これは、(コードに基づいて) 試行して閉じるたびに新しいダイアログを開く可能性があります。

代わりに、ダイアログを直接開くだけです..

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();
}

これによりダイアログが表示され、ダイアログが閉じられるまでプログラムの実行がこの時点で停止します。ダイアログは、選択されているものを確認できます。

于 2013-07-25T00:55:37.127 に答える
2

ここでの主な問題は、ファイル チューザがフレームに追加されていたことです。私の「今日の学習項目」は、それが可能であるということでした。

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;
}
于 2013-07-26T15:37:12.470 に答える