Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to deal with derived color in Nimbus Look and Feel?

What I want is to make the background of a uneditable text area the same as its disabled background.

I know that the color is available from the UIManager with the key TextArea.disabled:

DerivedColor(color=214,217,223 parent=control offsets=0.0,0.0,0.0,0 pColor=214,217,223

I firstly tried:

textArea.setBackground(UIManager.getColor("TextArea.disabled"));

It changed nothing at all and the background was still white.

Then I tried:

textArea.setBackground(new Color(UIManager.getColor("TextArea.disabled").getRGB()));

The background did change but was not exactly the same as the disabled background which looks brighter.

What is the correct way to deal with this derived color?

like image 936
Zhao Yi Avatar asked Oct 05 '22 09:10

Zhao Yi


1 Answers

@Zhao Yi wrote There is no key for uneditable background

  • again see Oracle Tutorial about Look and Feel, override proper Keys for JTextArea

  • Keys value is for Painter

  • TextArea[Disabled+NotInScrollPane].backgroundPainter

  • TextArea[Disabled].backgroundPainter

enter image description here

code for Java6, have to change imports for Java7

import com.sun.java.swing.Painter;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class TestNimbusUIManagerTextArea {

    private static JFrame frame = new JFrame("Nimbus UIDeafaults");
    private JTextArea testEnableTextArea = new JTextArea("enabled JTextArea");
    private JTextArea testDisableTextArea = new JTextArea("disabled JTextArea");

    public TestNimbusUIManagerTextArea() {
        testDisableTextArea.setEnabled(false);
        frame.setLayout(new GridLayout(2, 0, 20, 20));
        frame.add(testEnableTextArea);
        frame.add(testDisableTextArea);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(200, 105);
        frame.pack();
        frame.setVisible(true);
    }

    private static void customizeNimbusLaF() {
        UIManager.getLookAndFeelDefaults().put(
                "TextArea[Enabled+NotInScrollPane].backgroundPainter",
                new FillPainter(new Color(127, 255, 191)));
        UIManager.getLookAndFeelDefaults().put(
                "TextArea[Disabled+NotInScrollPane].backgroundPainter",
                new FillPainter(new Color(127, 255, 191)));
        SwingUtilities.updateComponentTreeUI(frame);
    }

    public static void main(String arg[]) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    customizeNimbusLaF();                   
                    break;
                }
            }
        } catch (Exception e) {
        }
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                TestNimbusUIManagerTextArea tNUIM = new TestNimbusUIManagerTextArea();
            }
        });
    }
}

class FillPainter implements Painter<JComponent> {

    private final Color color;

    FillPainter(Color c) {
        color = c;
    }

    @Override
    public void paint(Graphics2D g, JComponent object, int width, int height) {
        g.setColor(color);
        g.fillRect(0, 0, width - 1, height - 1);
    }
}
like image 194
mKorbel Avatar answered Oct 10 '22 02:10

mKorbel