Java 7, Farbe des Schaltflächentexts bei Verwendung von HTML-formatierten Beschriftungen

Ich habe eine benutzerdefinierte Benutzeroberfläche für bestimmte Schaltflächen, die durch Unterklassen von MetalButtonUI implementiert wird. Die Schaltflächen verwenden HTML-formatierte Beschriftungen. Dies ist eine Voraussetzung für mich, ich muss mehrzeilige Schaltflächenbeschriftungen unterstützen.

Aus irgendeinem Grund ist die Textfarbe bei deaktivierter Schaltfläche jetzt grau, wenn meine Anwendung auf Java 7 ausgeführt wird (aktuelles wissenschaftliches Update 4). Dies ist unter Java 4 oder 6 nicht der Fall.

Im HTML für die Schaltflächenbeschriftung kann ich die Schriftfarbe mithilfe von festlegen<font color=..> Dieser Wert wird jedoch ignoriert, wenn die Schaltfläche deaktiviert ist. Es scheint irgendwo, meine Schriftfarbe wird überschrieben, wenn die Schaltfläche deaktiviert ist. Verwenden<body style='color: ..'> ist auch unwirksam.

Ich habe versucht, Button.disabledText in UIDefaults einzustellen. Dies ist nicht das, was ich wirklich tun möchte, weil es zu viele Tasten betrifft. Bei HTML-formatierten Schaltflächenbeschriftungen ist dies jedoch in keinem Fall effektiv.

MetalButtonUI definiert getDisabledTextColor, aber die Implementierung ist nicht effektiv.

In ähnlicher Weise ist die Implementierung der paintText-Methode nicht effektiv. Es wird nicht für HTML-formatierte Beschriftungen aufgerufen.

Ich könnte die gesamte Malmethode außer Kraft setzen, aber das scheint eine zu komplexe Lösung zu sein.

Es gab einen Bugfix in diesem Bereich, der in Java 7 behoben wurde, siehehttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4783068 Der Fehlerbericht ist mir jedoch nicht sehr klar. Es ist nicht klar, was speziell geändert wurde oder wie das neue Verhalten außer Kraft gesetzt werden kann.

Kann jemand die Textfarbe für untaugliche Tasten steuern?

BEARBEITEN: Entschuldigung, ich hätte von Anfang an Beispielcode einfügen sollen. Mein ursprünglicher Code hatte benutzerdefinierte Klassen für die Schaltfläche und für die Benutzeroberfläche mit benutzerdefinierten paint () - Methoden in der Benutzeroberflächenklasse. Aber ich sehe jetzt, dass das Kernproblem sehr einfach demonstriert werden kann, mit nur einem Aufruf von button.setForeground (Color.black); In Java 6 wirkt sich dies auf die Textfarbe für aktivierte und deaktivierte Zustände aus. In Java 7 betrifft dies nur den aktivierten Zustand. mKorbel ... danke, dass du geholfen hast, das Problem einzugrenzen !!!!

    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();
                }
            });
        }
    }

Edit # 2: Dies wird jetzt von Oracle als Fehler erkannt, siehehttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7176683

Antworten auf die Frage(2)

Ihre Antwort auf die Frage