java - Swing - 如何模仿为什么我的外观会绘制禁用图标?

标签 java swing look-and-feel disabled-control

当您为 Swing 控件(例如 JButton)设置图标时,会自动生成一个禁用的图标,其颜色会变灰。我希望能够模仿针对禁用状态更改图标颜色的方式,因此我可以稍加改动创建自己的禁用图标,并将其设置为禁用按钮。

有没有办法实现这一点(除了首先实例化控件并检索它的图标,我正在寻找更直接、更少 hacky 的方法)?

最佳答案

Is there a way to achieve this (other then first instantiating the control and retrieving it's icon

好吧,LAF 负责创建禁用的图标。 AbstractButton 按钮类中的 getDisabledIcon() 方法如下所示:

Icon disabledIcon = UIManager.getLookAndFeel().getDisabledIcon(this, getIcon());

因此理论上 LAF getDisabledIcon() 方法期望将组件作为参数传入。所以你的问题的答案是:“是的,需要先创建按钮”。

但是在实践中(至少对于 Metal 和 Windows)组件似乎并没有实际用于创建图标,因此您可以执行以下操作:

ImageIcon original = new ImageIcon( ... );
Icon disabled = UIManager.getLookAndFeel().getDisabledIcon(null, original);

使用这种方法是有风险的,因为其他 LAF 可能确实需要该组件来创建禁用的图标。

但是,我想您可以创建单个组件,然后使用多个不同的图标调用此方法,而不是传递 null,因此它仍然比为每个图标创建一个独特的组件要好一些。

这是我用来测试这种方法的 SSCCE:

import javax.swing.*;
import javax.swing.plaf.metal.*;
import java.awt.*;
import java.awt.image.*;

public class ButtonDisabledIcon extends JPanel
{
    public ButtonDisabledIcon()
    {
        ImageIcon original = new ImageIcon( "dukewavered.gif" );

        JButton button1 = new JButton( "Original" );
        button1.setIcon( original );
        add(button1);

        JButton button2 = new JButton( "Disabled" );
        button2.setIcon(original);
        button2.setEnabled(false);
        add(button2);

        JButton button3 = new JButton( "LAF Disabled" );
        button3.setIcon( UIManager.getLookAndFeel().getDisabledIcon(null, original) );
        add(button3);
  }
    private static void createAndShowUI()
    {
/*
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch (Exception e) { }
*/
        JFrame frame = new JFrame("Button Disabled Icon");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new ButtonDisabledIcon() );
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

关于java - Swing - 如何模仿为什么我的外观会绘制禁用图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18848329/

相关文章:

Java:构造函数和方法如何处理继承

java - 套接字接收 null (Android)

java - apache lucene 4 的自定义分词器

java - 当我开始在文本字段中输入时如何制作自动完成列表?

java - JTree的选择路径

java - 如何调用 JFrame 并设置外观?

java - 关于桌面应用程序中的 Metro GUI

java - "Assisted"工厂的输出应该是@Singleton

java - 如何让 JProgressBar 匹配 Windows LaF?

java - 如何正确地将 JPanel 放置到 JFrame 上?