如何在 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对象并返回它的图标。

FileSystemViewFileView 类存在于 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 文件之外的所有类型的文件 [重复]

如何使用 JFileChooser 保存文件?

2K 显示器上的 JFileChooser 图标

如何从 JFileChooser(JAVA Swing) 中禁用文件操作、文件选择和过滤面板?

JFileChooser - 设置固定文件名

为 JFileChooser 上的选定文件设置自己的文件图标