Swing - 如何模仿为什么我的外观和感觉会禁用图标?

时间:2013-09-17 11:12:47

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

当您为Swing控件设置图标(例如JButton)时,会自动生成带有灰色 - 较暗颜色的禁用图标。我希望能够模仿禁用状态下图标颜色的更改方式,这样我就可以创建自己的禁用图标,并将其设置为禁用按钮。

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

2 个答案:

答案 0 :(得分:3)

  

有没有办法实现这个目标(除了首先实例化控件并检索它的图标

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

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

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

然而在实践中,(至少对于Metal和Windows)来说,该组件实际上并未用于创建图标,因此您可以执行以下操作:

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

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

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

以下是我用来测试这种方法的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();
            }
        });
    }
}

答案 1 :(得分:1)

在@ camickr的answer上放大,您可以试用getGray()L&F toolbar

gray icons

JToggleButton jtb = new JToggleButton("Plain", icon);
jtb.setEnabled(true);
this.add(jtb);

jtb = new JToggleButton("Disabled", icon);
jtb.setEnabled(false);
this.add(jtb);

jtb = new JToggleButton("Gray enabled", getGray(icon));
jtb.setEnabled(true);
this.add(jtb);

jtb = new JToggleButton("Gray disabled", getGray(icon));
jtb.setDisabledIcon(getGray(icon));
jtb.setEnabled(false);
this.add(jtb);