質問

私は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の独立した方法を知っている人はいますか?

役に立ちましたか?

解決

あなたが見るかもしれません setIcon() あなたの目的のために十分ですが、あなたもオーバーライドすることができます paint() の中に ButtonUI 委任。

補遺: @kleopatraのコメントはよくテイクされています:UIデリゲートを変更する いいえ 些細な。 @Mkorbelの最近 アプローチの難易度と汎用性の両方を示しています。その本質的な利点は、外観と感触の独立です。

いくつかの意欲的なアプローチが言及されています ここ.

他のヒント

「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);
                }
            }
        });
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top