Swing コントロール (たとえばJButton
) のアイコンを設定すると、灰色がかった暗い色の無効なアイコンが自動的に生成されます。無効状態でアイコンの色が変わる方法を模倣できるようにしたいので、少しひねって独自の無効アイコンを作成し、それを無効ボタンとして設定できます。
これを達成する方法はありますか (最初にコントロールをインスタンス化し、そのアイコンを取得する以外に、より簡単でハックの少ない方法を探しています)?
Swing コントロール (たとえばJButton
) のアイコンを設定すると、灰色がかった暗い色の無効なアイコンが自動的に生成されます。無効状態でアイコンの色が変わる方法を模倣できるようにしたいので、少しひねって独自の無効アイコンを作成し、それを無効ボタンとして設定できます。
これを達成する方法はありますか (最初にコントロールをインスタンス化し、そのアイコンを取得する以外に、より簡単でハックの少ない方法を探しています)?
これを達成する方法はありますか(最初にコントロールをインスタンス化し、そのアイコンを取得する以外に
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);