選択したjtogglebuttonの背景色を変更します
-
24-10-2019 - |
質問
私はaの色を変えようとしています JToggleButton
信頼できる、外観と感触の独立した方法で選択されたとき。
金属L&Fを使用する場合、Uimanagerを使用することはアプローチです。
UIManager.put("ToggleButton.selected", Color.RED);
ノート: :Iyyは、上記のプロパティ名にタイプミスがあったことを指摘しましたが、ここに来る人のために上に残しますが、実際のプロパティ名は次のとおりです。
UIManager.put("ToggleButton.select", Color.RED);
ただし、これは現在のルックアンドフィール(現在はWindows XP)では機能しません。さらに分析した後、システムはWindows(Still XP)の外観と感触がいずれも使用していないようです。 Color
- ベース UIManager
のプロパティ ToggleButton
まったく、または少なくともそれ自体を供給しません(オンラインで簡単な例があります からすべてのプロパティキーを見つけます UIManager
, 、この例では、明示的には便利に制限されています Color
プロパティ)。
背景色を設定してみました。
Action action = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) { /* stuff */ }
};
JToggleButton button = new JToggleButton(action);
// tried with and without opaque true
button.setOpaque(true);
button.setBackground(Color.RED);
選択した状態を変更するだけでなく、選択されていない状態にも影響しません。
アクションを受け取った後にのみ、背景色を変更しようとしました。
@Override
public void actionPerformed(ActionEvent e)
{
JToggleButton button = (JToggleButton)e.getSource();
if (button.isSelected()) // alternatively, (Boolean)getValue(Action.SELECTED_KEY)
{
button.setBackground(Color.RED);
}
}
それはどれも機能しません。私が仕事をしたことがわかった唯一のことは、選択した状態でボタンを自分で描く必要があります(標準以外の見た目ではありますが、実用的な例につながります):
private class ColoredToggleButton extends JToggleButton
{
ColoredToggleButton(Action action, Color color)
{
super(action);
setBackground(color);
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (this.isSelected())
{
int w = getWidth();
int h = getHeight();
String s = getText();
// selected color
g.setColor(getBackground());
g.fillRect(0, 0, w, h);
// selected foreground color
g.setColor(SystemColor.controlText);
g.drawString(s,
(w - g.getFontMetrics().stringWidth(s)) / 2 + 1,
(h + g.getFontMetrics().getAscent()) / 2 - 1);
}
}
}
これは、これのコメントからわずかに変更されています Javaバグレポート. 。興味深いことに(面白いことに?)、1998年に修正されたと主張しています。
選択したjtogglebuttonの背景色を設定するためのより良い、L&Fの独立した方法を知っている人はいますか?
他のヒント
「ToggleButton.Selected」は間違っています。「ToggleButton.Select」が必要です。コンポーネントに更新する必要があります。
UIManager.put("ToggleButton.select", Color.WHITE);
SwingUtilities.updateComponentTreeUI(togglebuttonname);
JToggleButton btn = new JToggleButton(...);
btn.setUI(new MetalToggleButtonUI() {
@Override
protected Color getSelectColor() {
return Color.RED;
}
});
各塗り直しの前に背景色を強制することができます。そのため、PaintComponentを変更する必要があります。ボタンが切り替えられているかどうかを確認し、状態の切り替えに応じて背景を設定し、最後にスーパークラスに実際のペイントジョブを実行させます。
public class ColoredToggleButton extends JToggleButton
{
@Override
public void paintComponent(Graphics g)
{
Color bg;
if (isSelected()){
bg = Color.GREEN;
} else {
bg = Color.RED;
}
setBackground(bg);
super.paintComponent(g);
}
}
UIでメソッドをオーバーライドする代わりにアクションリスナーを使用したい場合は、UIをUIに変更するだけで変更できます。 selectColor
プロパティ。
これが私が最近使用した例です
private class FavouriteToggle extends JToggleButton {
public FavouriteToggle() {
setUI(new BasicToggleButtonUI()); //Removes selectColor
////Your Custom L&F Settings////
setBackground(new Color(255, 252, 92));
setForeground(Color.GRAY);
setText("Favourite");
setBorder(null);
setFocusPainted(false);
////Add your own select color by setting background////
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(((JToggleButton) e.getSource()).isSelected()) {
setForeground(Color.BLACK);
setBackground(new Color(255, 251, 0));
} else {
setBackground(new Color(255, 252, 92));
setForeground(Color.GRAY);
}
}
});
}
}