0

以前の 2 つの投稿(こちら) と別の投稿 (こちら) に続いて、次のコードは、展開されたブラウザーではなく、通常のファイル ブラウザーを開きます。

public class GuiHandler extends javax.swing.JFrame {
    // data members
    private DataParser xmlParser = new DataParser();
    private File newFile;
    JFileChooser jfc = new JFileChooser();

    // more code 

    public void launchFileChooser() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch(Exception e) {
                    e.printStackTrace();
                }
                jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
                jfc.setAcceptAllFileFilterUsed(false);
                if (jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
                    newFile = jfc.getSelectedFile();
            }
        });
    }

    // more code 

    private void XMLfilesBrowserActionPerformed(java.awt.event.ActionEvent evt) {       
        launchFileChooser();
        xmlParser.getNodeListFromFile(newFile);
        // here the code has the below problems 

問題:

  1. ボタンを押すと、コードは通常のファイル ブラウザを開きますopen XML file。それでもファイルを選択できます。
  2. 例外がスローされます。
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: File cannot be null
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:198)

jfcデータメンバーの場合は通常のブラウザが開き、ローカル変数の場合は展開されたブラウザが開くのはなぜですか?

4

2 に答える 2

2

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());通常のファイル チューザーと拡張ファイル チューザーに関しては、 を呼び出す前に必ず を呼び出してnew JFileChooser();ください。main実際には、ユーザーがアプリケーションの実行中にルック アンド フィール (L&F) を変更できるようにする場合を除き、Swing コンポーネントを作成する前に、メソッドのように、アプリケーションの実行の開始近くで L&F を設定します。私の経験から、そうしないと、奇妙な UI 動作が発生する可能性があります。

JFileChooserでローカル変数として持つとlaunchFileChooser、のUIManager.setLookAndFeel前に呼び出されnew JFileChooserます。がJFileChooserクラス メンバー変数 (別名データ メンバー) の場合、 のUIManager.setLookAndFeel後に呼び出されnew JFileChooserます。後者の場合、 のJFileChooserインスタンスがインスタンス化されるときに が作成されGuiHandlerます。


の代わりにIllegalArgumentException使用SwingUtilities.invokeAndWaitすることについて。さらに良いことに、常にイベント ディスパッチ スレッドで発生することが確実な場合は、またはを呼び出す必要はありません。launchFileChooserSwingUtilities.invokeLaterlaunchFileChooserSwingUtilities.invokeAndWaitSwingUtilities.invokeLater


ファイル フィルターを使用することもできます。

jfc.setFileFilter(new FileNameExtensionFilter("XML files (*.xml)", "xml"));

以下は、上記の概念を示すSSCEです。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.filechooser.FileNameExtensionFilter;

public class GuiHandler extends JFrame {
    public static void main(String[] args) throws Exception {
        // call UIManager.setLookAndFeel early in application execution
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        JFrame frame = new GuiHandler();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    private final JFileChooser jfc;

    public GuiHandler() {
        this.jfc = new JFileChooser();
        this.jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        this.jfc.setFileFilter(new FileNameExtensionFilter("XML files (*.xml)", "xml"));

        final JButton button = new JButton("Open XML file");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                xmlFilesBrowserActionPerformed();
            }
        });
        add(button);

        pack();
    }

    protected void xmlFilesBrowserActionPerformed() {
        final File xmlFile = getXmlFile();
        if (xmlFile != null) {
            System.out.println(xmlFile); // process XML file
        }
    }

    private File getXmlFile() {
        // At this point we should be on the event dispatch thread,
        // so there is no need to call SwingUtilities.invokeLater
        // or SwingUtilities.invokeAndWait.
        if (this.jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
            return this.jfc.getSelectedFile();
        }
        return null;
    }
}
于 2012-06-06T05:08:05.067 に答える
0

「拡張されたもの」が何を意味するのか正確にはわかりませんが、ファイルフィルターについて言及していると思います。ファイルフィルターがない場合、デフォルトですべてのファイルを表示するようになっていると思います。ダイアログを開く前に、次のコードを追加してみてください。

jfc.setFileFilter(new javax.swing.filechooser.FileFilter(){
    public boolean accept(File f){
        return  f.isDirectory() || f.getName().toLowerCase().endsWith(".xml");
    }
    public String getDescription(){
        return "XML File";
    }
})
于 2012-06-06T05:45:01.760 に答える