如何在 JFileChooser 中显示文件的默认系统图标?
Posted
技术标签:
【中文标题】如何在 JFileChooser 中显示文件的默认系统图标?【英文标题】:How to display default system icon for files in JFileChooser? 【发布时间】:2013-07-11 21:21:28 【问题描述】:如何显示JFileChooser
中文件的默认系统图标?即JFileChooser
中文件的图标应该与桌面和资源管理器中出现的图标相同?
例如,NetBeans 图标在JFileChooser
中的显示与在桌面上显示的不同!
如何做到这一点?
【问题讨论】:
如果它有助于解决问题,请accept 回答。对于earlier questions 中的许多人来说,情况大致相同。当然,注意到该页面中没有答案的那个,总是可以选择删除它(或将其标记为删除)。 【参考方案1】:我们可以使用FileSystemView
类并通过在其中调用getFileSystemView()
静态方法来获取它的对象,然后使用getSystemIcon()
方法获取File
对象并返回它的图标。
FileSystemView
和 FileView
类存在于 javax.swing.filechooser
包中。
File
类在 java.io
包中。
注意: FileSystemView
不会扩展 FileView
。因此,您不能在 jf.setFileView()
中使用 FileSystemView
对象
JFileChooser jf=new JFileChooser();
jf.setFileView(new MyFileView());
jf.showOpenDialog(this);
class MyFileView extends FileView
public Icon getIcon(File f)
FileSystemView view=FileSystemView.getFileSystemView();
return view.getSystemIcon(f);
this
表示当前帧。假设写这段代码的类是JFrame
的子类
或者用一种简单的方式,
jf.setFileView(new FileView()
public Icon getIcon(File f)
return FileSystemView.getFileSystemView().getSystemIcon(f);
);
【讨论】:
【参考方案2】:@JavaTechnical 展示的方式是一种方式。这是另一种(更简单)的方法。将 GUI(或至少文件选择器)设置为原生 PLAF。例如
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class FileChooserIcons
public static void main(String[] args)
Runnable r = new Runnable()
@Override
public void run()
try
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
catch(Exception e)
e.printStackTrace();
// the GUI as seen by the user (without frame)
JPanel gui = new JPanel(new BorderLayout());
gui.setBorder(new EmptyBorder(20, 30, 20, 30));
JButton browse = new JButton("Show File Chooser");
final JFrame f = new JFrame("File Chooser");
ActionListener showChooser = new ActionListener()
JFileChooser jfc = new JFileChooser();
@Override
public void actionPerformed(ActionEvent e)
jfc.showOpenDialog(f);
;
browse.addActionListener(showChooser);
gui.add(browse);
f.add(gui);
// Ensures JVM closes after frame(s) closed and
// all non-daemon threads are finished
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// See http://***.com/a/7143398/418556 for demo.
f.setLocationByPlatform(true);
// ensures the frame is the minimum size it needs to be
// in order display the components within it
f.pack();
// should be done last, to avoid flickering, moving,
// resizing artifacts.
f.setVisible(true);
;
// Swing GUIs should be created and updated on the EDT
// http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
SwingUtilities.invokeLater(r);
当然,如果您有勇气,您可以创建一个自定义文件选择器,以 File Browser GUI 之类的开头。
【讨论】:
嗯。那很好!如果我想改变外观和感觉怎么办,说我喜欢 NimbusLookAndFeel! ;) @JavaTechnical “我喜欢 NimbusLookAndFeel” 你喜欢 bug? Nimbus 是有史以来开发的漏洞最多的 PLAF 之一。 ..这是在说些什么! +1 好的。顺便说一句,您对它的外观和定制方式有何看法? :) 嗯..我对此没有强烈的意见或感受。我从未尝试过自定义JFileChooser
(除了明显的“PLAF”)。
我热烈地记得那个程序和它的发展! 1+以上是关于如何在 JFileChooser 中显示文件的默认系统图标?的主要内容,如果未能解决你的问题,请参考以下文章
如何使 JFileChooser 显示除 .huff 文件之外的所有类型的文件 [重复]