1

MetalButtonUI をサブクラス化することによって実装された、特定のボタンのカスタム UI があります。ボタンは HTML 形式のラベルを使用します。これは私の要件です。複数行のボタン ラベルをサポートする必要があります。

何らかの理由で、私のアプリケーションが Java 7 (科学的に最新のアップデート 4) で実行されている場合、ボタンが無効になっているときのテキストの色が灰色になりました。これは、Java 4 または 6 で実行している場合には発生しません。

ボタン ラベルの HTML では、 を使用してフォントの色を設定でき<font color=..>ますが、ボタンが無効になっている場合、この値は無視されます。ボタンを無効にすると、フォントの色が上書きされるようです。使用し<body style='color: ..'>ても効果がありません。

UIDefaults で Button.disabledText を設定してみました。これはあまりにも多くのボタンに影響を与えるため、私が本当にやりたいことではありません。ただし、いずれにせよ、HTML 形式のボタン ラベルには効果的ではありません。

MetalButtonUI では getDisabledTextColor を定義していますが、実装しても効果がありません。

同様に、paintText メソッドの実装も効果的ではありません。HTML 形式のラベルでは呼び出されません。

ペイント メソッド全体をオーバーライドすることもできますが、それは非常に複雑なソリューションのようです。

この領域にはバグ修正があり、Java 7 で修正されたと報告されています。http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4783068を参照してください。具体的に何が変更されたのか、または新しい動作をオーバーライドする方法は明らかではありません。

無効なボタンのテキストの色を制御する方法を知っている人はいますか?

編集:申し訳ありませんが、最初からサンプルコードを含める必要がありました。元のコードには、ボタンと UI のカスタム クラスがあり、UI クラスにカスタム paint() メソッドがありました。しかし、核となる問題は、button.setForeground(Color.black); を呼び出すだけで、非常に簡単に実証できることがわかりました。Java 6 では、これは有効な状態と無効な状態の両方のテキストの色に影響します。Java 7 では、有効な状態にのみ影響します。mKorbel ... 問題の切り分けにご協力いただきありがとうございます!!!!

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.*;


    public class DisabledButtonDemo {


        public DisabledButtonDemo() {
            final JToggleButton button = new JToggleButton(
               "<html><center>Button<br/>Label</center></html>");      

            // Next line sets the text color. 
            // In Java 6 it is respected, for both enabled and disabled state.
            // In Java 7, it is only used for the enabled state.
            button.setForeground(Color.black); 
            button.setPreferredSize(new Dimension(100, 100));

            final JButton controlButton = new JButton(
               "Toggle Enabled/Disabled");
            controlButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    button.setEnabled(!button.isEnabled());
                }
            });

            JFrame f = new JFrame("ButtonTest");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setLayout(new GridLayout(2,1));
            f.add(button);
            f.add(controlButton);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }

        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {

                @Override
                public void run() {
                    DisabledButtonDemo t = new DisabledButtonDemo();
                }
            });
        }
    }

編集 #2: これは現在、Oracle によってバグとして追跡されています。http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7176683を参照してください。

4

2 に答える 2

2

無効なボタンのテキストの色を制御する方法を知っている人はいますか?

方法の1つ(あなたはHtmlを意味しました)は

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class HtmlAndJButton {

    public HtmlAndJButton() {
        final String buttonText = " Whatever, but nothing wise";
        final JButton button = new JButton(buttonText);
        JButton btn1 = new JButton("Toggle");
        btn1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                button.setText("<html><font color=" + (button.isEnabled() ? "blue" : "red") + ">"
                + buttonText + "</font></html>");
                button.setEnabled(!button.isEnabled());
            }
        });
        JFrame f = new JFrame("ButtonTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new GridLayout(2,1));
        f.add(button);
        f.add(btn1);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                HtmlAndJButton t = new HtmlAndJButton();
            }
        });
    }
}
于 2012-06-08T19:52:59.173 に答える
0

あなたの質問に投稿したバグレポートを読みましたが、この問題を解決する回避策が提供されました。以下のクラスを作成します。

/**
 * Attaches to a JButton to work around Sun bug 4783068.
 * <p>http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4783068</p>
 */
public final class SunBug4783068Fixer implements PropertyChangeListener {

private static final SunBug4783068Fixer INSTANCE = new SunBug4783068Fixer();

public static void attach(AbstractButton to) {
    // Prevents adding it more than once to any single component.
    to.removePropertyChangeListener(INSTANCE);

    to.addPropertyChangeListener(INSTANCE);
}

public static void remove(AbstractButton from) {
    from.removePropertyChangeListener(INSTANCE);
}

public void propertyChange(PropertyChangeEvent evt) {
    if ((evt.getSource() instanceof AbstractButton)
         && "enabled".equals(evt.getPropertyName())) {
        AbstractButton target = (AbstractButton) evt.getSource();
        target.setForeground(target.isEnabled()
            ? (Color) UIManager.getDefaults().get("Button.foreground")
            : (Color) UIManager.getDefaults().get("Button.disabledText"));
    }
  }
}

次に、次のように JToggleButton に追加します

 final JButton controlButton = new JButton("Toggle Enabled/Disabled");
        controlButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                button.setEnabled(!button.isEnabled());
            }
        });
 controlButton.addPropertyChangeListener(new SunBug4783068Fixer());
于 2012-06-12T15:41:12.200 に答える