Java 7, cor do texto do botão ao usar rótulos formatados em HTML

Eu tenho uma interface personalizada para certos botões, implementados por subclassificação MetalButtonUI. Os botões usam rótulos formatados em HTML. Este é um requisito para mim, eu preciso apoiar rótulos de botão de múltiplas linhas.

Por algum motivo, quando meu aplicativo é executado no Java 7 (atualização cientificamente 4, a mais atual), a cor do texto quando o botão está desabilitado fica cinza. Isso não acontece quando executado no Java 4 ou 6.

No HTML para o rótulo do botão, posso definir a cor da fonte usando<font color=..> No entanto, esse valor é ignorado quando o botão está desativado. Parece que em algum lugar, a cor da minha fonte é substituída quando o botão está desabilitado. Usando<body style='color: ..'> também é ineficaz.

Eu tentei definir Button.disabledText em UIDefaults. Isso não é o que eu realmente quero fazer porque afeta muitos botões. Mas, em qualquer caso, não é eficaz para rótulos de botão formatados em HTML.

MetalButtonUI define getDisabledTextColor, mas implementá-lo não é efetivo.

Da mesma forma, implementar o método paintText não é efetivo. Não é invocado para rótulos formatados em HTML.

Eu poderia substituir todo o método de pintura, mas isso parece ser uma solução excessivamente complexa.

Havia uma correção de bug nesta área, relatada corrigida no Java 7, vejahttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4783068 O relatório de bug não é muito claro para mim no entanto. Não está claro o que especificamente foi alterado ou como substituir o novo comportamento.

Alguém sabe como controlar a cor do texto para botões desativados?

EDIT: Desculpe eu deveria ter incluído o código de exemplo a partir do get-go. Meu código original tinha classes personalizadas para o botão e para a interface do usuário, com métodos paint () personalizados na classe de interface do usuário. Mas agora vejo que o problema central pode ser demonstrado de forma muito simples, com apenas uma chamada para button.setForeground (Color.black); No Java 6 isso afeta a cor do texto para os estados ativado e desativado. No Java 7, afeta apenas o estado ativado. mKorbel ... obrigado por ajudar a isolar o problema !!!!

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

Editar # 2: isso agora é rastreado como um bug pela Oracle, vejahttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7176683

questionAnswers(2)

yourAnswerToTheQuestion