从当前的 LookAndFeel 中查找 Icon

Find Icon from the current LookAndFeel

我有一个正在创建的应用程序 DefaultTreeCellRenderer。为此,我想显示 FileDirectory.

中的默认系统图标

在应用程序开始时,我正在设置系统外观

java.awt.EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        try {
            // Set System L&F
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }
        new App().setVisible(true);
    }
});

所有 UI 都具有系统外观。但是当我用我的自定义 DefaultTreeCellRenderer 创建一个 JTree 时,我是 return DefaultTreeCellRenderer#getIcon 下面的 static 字段。

private static final Icon FILE             = UIManager.getIcon("FileView.fileIcon");
private static final Icon FOLDER           = UIManager.getIcon("FileView.directoryIcon");

结果是默认值来自系统。但是 FILEFOLDER 指向默认的 LookAndFeel.

如何从系统 Look And Feel 中获取值?拥有所有相同的图标。

But the FILE and FOLDER are pointing to the default LookAndFeel.

那么尝试为您要处理的系统设置 LAF。类似于:

UIManager.setLookAndFeel( laf1 );
Icon laf1Icon = UIManager.getIcon("FileView.fileIcon");
Icon laf1Folder = UIManager.getIcon("FileView.directoryIcon");
UIManager.setLookAndFeel( laf2 );
Icon laf2Icon = UIManager.getIcon("FileView.fileIcon");
Icon laf2Folder = UIManager.getIcon("FileView.directoryIcon");
//...
UIManager.setLookAndFeel( backToTheDefault );

您可以通过查看 UIManager Defaults 查看此方法的结果。随着 LAF 的变化,图标也会发生变化。当然,这仅适用于您系统上可用的 LAF,并非所有可能的远程文件系统。