10

JToggleButton信頼性の高い、ルック アンド フィールに依存しない方法で選択されたときに、a の色を変更しようとしています。

Metal L&F を使用している場合は、UIManager を使用する方法があります。

UIManager.put("ToggleButton.selected", Color.RED);

: Iyy は、上記のプロパティ名にタイプミスがあることを指摘しましたが、ここに来る人々のために上に残しておきますが、実際のプロパティ名は次のようになるはずです:

UIManager.put("ToggleButton.select", Color.RED);

ただし、これは現在のルック アンド フィール (現在の Windows XP) では機能しません。さらに分析した結果、Windows (まだ 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 に依存しないより良い方法を知っている人はいますか?

4

6 に答える 6

8
JToggleButton btn = new JToggleButton(...);
btn.setUI(new MetalToggleButtonUI() {
    @Override
    protected Color getSelectColor() {
        return Color.RED;
    }
});
于 2014-03-30T03:07:17.093 に答える
6

「ToggleButton.selected」は間違っています。「ToggleButton.select」が必要です。そして、コンポーネントに更新する必要があります。

UIManager.put("ToggleButton.select", Color.WHITE);
SwingUtilities.updateComponentTreeUI(togglebuttonname);
于 2013-03-05T04:38:50.540 に答える
3

setIcon()目的に十分かどうかがわかるかもしれませんがpaint()ButtonUIデリゲートでオーバーライドすることもできます。

補遺: @kleopatra のコメントはよく理解されています: UI デリゲートの変更は簡単ではありません。@mKorbel の最近のは、アプローチの難しさと多様性の両方を示しています。その本質的な利点は、ルック アンド フィールの独立性です。

ここでは、あまり野心的ではないアプローチについて説明します

于 2011-04-27T17:52:09.997 に答える