【问题标题】:What are all the available images within JRE?JRE 中所有可用的图像是什么?
【发布时间】:2020-03-31 21:08:38
【问题描述】:

我的程序需要简单的图标,例如齿轮、箭头等。放弃我的程序而不用担心主机文件系统上的额外图像会很好。我知道 JRE for Swing 中包含一些图像,例如黄色警告三角形:

仍然,我无法在我正在使用的 JRE 中找到上述三角形。所以我不知道如何使用它(除非使用JOptionPane.showMessageDialog(null, "My warning message", "WARNING", JOptionPane.WARNING_MESSAGE);

【问题讨论】:

  • 考虑使用 Unicode 字符,而不是图像。对于齿轮,请尝试使用"\u2699""\u26ed""\u26ee"。对于箭头,Unicode 中有整个块:Arrows;补充箭头-A、-B 和 -C;和Miscellaneous Symbols and Arrows。有许多符号块,例如杂项符号、装饰符号、几何形状以及杂项符号和象形文字。使用字符的一个好处是它们可以很好地扩展。

标签: java


【解决方案1】:

这些图像与标准库类文件捆绑在一起,位于 JDK 目录中的一个大“模块”文件中。见这里:How to extract the file jre-9/lib/modules?

这个warning.png 图像特别存储为模块文件中的javax/swing/plaf/metal/icons/ocean/warning.png。您可以在此处查看 OpenJDK 源代码中所有“海洋”主题图标的列表:https://github.com/openjdk/jdk/tree/master/src/java.desktop/share/classes/javax/swing/plaf/metal/icons/ocean

【讨论】:

  • 谢谢!你知道这些文件在 JRE 9 和模块引入之前在哪里吗?
  • 可能在 rt.jar 中
【解决方案2】:

考虑使用 Unicode 字符,而不是图像。对于齿轮,请尝试使用"\u2699""\u26ed""\u26ee"。对于箭头,Unicode 中有整个块:Arrows;补充箭头-A、-B 和 -C;和Miscellaneous Symbols and Arrows。有许多符号块,例如杂项符号、装饰符号、几何形状以及杂项符号和象形文字。使用字符的一个好处是它们可以很好地扩展。

如果您必须拥有 JOptionPane 图标,您可以使用它们对应的默认键检索它们:

import java.awt.*;
import javax.swing.*;

public class JOptionPaneIconDisplayer {
    static void show() {
        Icon info = UIManager.getIcon("OptionPane.informationIcon");
        Icon warning = UIManager.getIcon("OptionPane.warningIcon");
        Icon error = UIManager.getIcon("OptionPane.errorIcon");
        Icon question = UIManager.getIcon("OptionPane.questionIcon");

        JPanel panel = new JPanel(new GridLayout(1, 0, 12, 12));
        panel.add(new JLabel(info));
        panel.add(new JLabel(warning));
        panel.add(new JLabel(error));
        panel.add(new JLabel(question));

        panel.setBorder(BorderFactory.createEmptyBorder(24, 24, 24, 24));

        JFrame frame = new JFrame("JOptionPane Icons");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> show());
    }
}

尝试直接从类路径资源读取图标不是一个好主意,因为它们的名称和位置可能会从一个 Java 版本到下一个版本发生变化。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2014-11-24
    • 1970-01-01
    • 2013-01-02
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2016-09-30
    相关资源
    最近更新 更多