gpt4 book ai didi

java - JFileChooser 打开常规文件浏览器而不是扩展文件浏览器

转载 作者:行者123 更新时间:2023-12-02 07:45:36 31 4
gpt4 key购买 nike

继我之前的两篇文章之后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

问题:

  1. 当我点击打开 XML 文件按钮时,代码会打开常规文件浏览器;它仍然允许我选择一个文件。
  2. 它抛出异常:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: File cannot be null
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:198)

如果jfc是数据成员,为什么它会打开常规浏览器,而当它是本地成员时,它会打开常规浏览器变量,展开的变量会打开吗?

最佳答案

关于常规文件选择器与扩展文件选择器,请务必调用 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());在调用new JFileChooser();之前。实际上,除非您允许用户在应用程序执行期间更改外观和感觉 (L&F),否则请将 L&F 设置为接近应用程序执行的开头,如 main 中所示。方法,在创建任何 Swing 组件之前。根据我的经验,不这样做可能会导致一些奇怪的 UI 行为。

当你有JFileChooser时作为 launchFileChooser 中的局部变量, UIManager.setLookAndFeelnew JFileChooser 之前调用。当JFileChooser是一个类成员变量(也称为数据成员),UIManager.setLookAndFeelnew JFileChooser 之后调用;在后一种情况下,JFileChooserGuiHandler 的实例时创建已实例化。

<小时/>

关于IllegalArgumentException使用SwingUtilities.invokeAndWaitlaunchFileChooser而不是 SwingUtilities.invokeLater 。更好的是,如果您确定launchFileChooser将始终发生在事件调度线程上,无需调用 SwingUtilities.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;
}
}

关于java - JFileChooser 打开常规文件浏览器而不是扩展文件浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10908390/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com