按照我之前的两篇帖子here和另一篇one here,以下代码 打开常规文件浏览器而不是展开的文件:
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
问题:
open XML file
时,代码会打开常规文件浏览器;它仍然允许我选择一个文件。Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: File cannot be null
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:198)
如果jfc
是数据成员,并且它是本地成员,为什么它会打开常规浏览器
变量,展开的变量?
答案 0 :(得分:2)
关于常规文件选择器和扩展文件选择器,请务必在致电UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
之前致电new JFileChooser();
。实际上,除非您允许用户在应用程序执行期间更改外观(L& F),否则在创建任何Swing组件之前,将L& F设置为接近应用程序执行的开始,就像在main
方法中一样。根据我的经验,不这样做会导致一些奇怪的UI行为。
如果JFileChooser
中有launchFileChooser
作为本地变量,UIManager.setLookAndFeel
之前会调用new JFileChooser
。当JFileChooser
是类成员变量(a.k.a。数据成员)时,UIManager.setLookAndFeel
之后调用new JFileChooser
;在后一种情况下,JFileChooser
是在实例化GuiHandler
的实例时创建的。
关于IllegalArgumentException
使用SwingUtilities.invokeAndWait
代替SwingUtilities.invokeLater
而不是SSCE。更好的是,如果您确定launchFileChooser
将始终出现在事件派发线程上,则无需调用launchFileChooser
或SwingUtilities.invokeAndWait
。
您可能还想使用文件过滤器:
SwingUtilities.invokeLater
以下是展示上述概念的{{3}}:
jfc.setFileFilter(new FileNameExtensionFilter("XML files (*.xml)", "xml"));
答案 1 :(得分: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";
}
})