当您为 Swing 控件设置图标(例如 a JButton
)时,会自动生成一个带有灰色深颜色的禁用图标。我希望能够模仿禁用状态下更改图标颜色的方式,因此我可以稍微扭曲创建自己的禁用图标,并将其设置为禁用按钮。
有没有办法实现这一点(除了首先实例化控件并检索它的图标,我正在寻找更直接的更少hacky的方式)?
当您为 Swing 控件设置图标(例如 a JButton
)时,会自动生成一个带有灰色深颜色的禁用图标。我希望能够模仿禁用状态下更改图标颜色的方式,因此我可以稍微扭曲创建自己的禁用图标,并将其设置为禁用按钮。
有没有办法实现这一点(除了首先实例化控件并检索它的图标,我正在寻找更直接的更少hacky的方式)?
有没有办法实现这一点(然后首先实例化控件并检索它的图标
好吧,LAF 负责创建禁用的图标。按钮类的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 可能确实需要该组件来创建禁用的图标。
但是,我想您可以创建一个单独的组件,然后使用多个不同的图标调用此方法,而不是传递 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();
}
});
}
}
放大@camickr 的答案,您可以尝试getGray()
这个L&F 工具栏。
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);