Set Text Field's Disabled Background Color

后端 未结 1 1674
庸人自扰
庸人自扰 2021-01-05 15:56

I have a textfield which I set seteditable(false) and setEnabled(false) but the problem is that in this case the background color of it changes to

1条回答
  •  既然无缘
    2021-01-05 16:37

    The "inactive" color is provided (generally) by the look and feel. For example, under Windows the property TextField.inactiveBackground can be used to effect the non-editable background color...

    TextField

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.plaf.ColorUIResource;
    
    public class TestTextField {
    
        public static void main(String[] args) {
            new TestTextField();
        }
    
        public TestTextField() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    UIManager.put("TextField.inactiveBackground", new ColorUIResource(new Color(255, 0, 0)));
    
                    JTextField field = new JTextField("Hello", 10);
                    field.setEditable(false);
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new FlowLayout());
                    frame.add(field);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
    }
    

    Updated with Nimbus example

    Nimbus just likes to be difficult...

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    import java.awt.Graphics2D;
    import java.awt.Insets;
    import java.awt.Paint;
    import java.awt.Rectangle;
    import java.awt.Shape;
    import java.awt.geom.Ellipse2D;
    import java.awt.geom.Path2D;
    import java.awt.geom.Rectangle2D;
    import java.awt.geom.RoundRectangle2D;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.Painter;
    import javax.swing.SwingUtilities;
    import javax.swing.UIDefaults;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.plaf.ColorUIResource;
    import javax.swing.plaf.nimbus.AbstractRegionPainter;
    
    public class TestTextField {
    
        public static void main(String[] args) {
            new TestTextField();
        }
    
        public TestTextField() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
    //                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
    
                    JTextField field = new JTextField("Hello", 10);
                    field.setEditable(false);
                    field.setEnabled(false);
                    UIDefaults overrides = new UIDefaults();
                    overrides.put("TextField.background", new ColorUIResource(Color.RED));
                    overrides.put("TextField[Enabled].backgroundPainter", new Painter() {
    
                        @Override
                        public void paint(Graphics2D g, JTextField field, int width, int height) {
                            g.setColor(Color.RED);
                            g.fill(new Rectangle(0, 0, width, height));
                        }
    
                    });
                    overrides.put("TextField[Disabled].backgroundPainter", new Painter() {
    
                        @Override
                        public void paint(Graphics2D g, JTextField field, int width, int height) {
                            g.setColor(Color.GREEN);
                            Insets insets = field.getInsets();
                            g.fill(new Rectangle(
                                    insets.left, 
                                    insets.top, 
                                    width - (insets.left + insets.right), 
                                    height - (insets.top + insets.bottom)));
                        }
    
                    });
                    field.putClientProperty("Nimbus.Overrides", overrides);
    //                field.putClientProperty("Nimbus.Overrides.InheritDefaults",false);
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new FlowLayout());
                    frame.add(field);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }
    

    I've only shown two values (default and disabled), you'll need to play around with the others.

    TextField.background = DerivedColor(color=255,255,255 parent=nimbusLightBackground offsets=0.0,0.0,0.0,0 pColor=255,255,255
    TextField.contentMargins = javax.swing.plaf.InsetsUIResource[top=6,left=6,bottom=6,right=6]
    TextField.disabled = DerivedColor(color=214,217,223 parent=control offsets=0.0,0.0,0.0,0 pColor=214,217,223
    TextField.disabledText = DerivedColor(color=142,143,145 parent=nimbusDisabledText offsets=0.0,0.0,0.0,0 pColor=142,143,145
    TextField.focusInputMap = javax.swing.plaf.InputMapUIResource@6a4ba620
    TextField.font = javax.swing.plaf.FontUIResource[family=SansSerif,name=sansserif,style=plain,size=12]
    TextField.foreground = DerivedColor(color=0,0,0 parent=text offsets=0.0,0.0,0.0,0 pColor=0,0,0
    TextFieldUI = javax.swing.plaf.synth.SynthLookAndFeel
    TextField[Disabled].backgroundPainter = javax.swing.plaf.nimbus.TextFieldPainter@c87b565
    TextField[Disabled].borderPainter = javax.swing.plaf.nimbus.TextFieldPainter@21960050
    TextField[Disabled].textForeground = DerivedColor(color=142,143,145 parent=nimbusDisabledText offsets=0.0,0.0,0.0,0 pColor=142,143,145
    TextField[Enabled].backgroundPainter = javax.swing.plaf.nimbus.TextFieldPainter@7eee9569
    TextField[Enabled].borderPainter = javax.swing.plaf.nimbus.TextFieldPainter@61936199
    TextField[Focused].borderPainter = javax.swing.plaf.nimbus.TextFieldPainter@12ecb5db
    TextField[Selected].backgroundPainter = javax.swing.plaf.nimbus.TextFieldPainter@72974691
    TextField[Selected].textForeground = DerivedColor(color=255,255,255 parent=nimbusSelectedText offsets=0.0,0.0,0.0,0 pColor=255,255,255
    

    Interestingly, if you use field.putClientProperty("Nimbus.Overrides.InheritDefaults",false);, then you tend to end up with a very simple field (no borders, etc).

    This approach only effects a single component...

    0 讨论(0)
提交回复
热议问题