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を参照してください。