Swing Nimbus改变了不可编辑的JTextField的样式

问题描述 投票:1回答:2

有没有办法改变不可编辑的JTextField的样式?如果设置为editable = false,我们想给TextField一个稍微浅灰色的背景。我想有一种方法

readonlyComponent.setBackground(Color.LIGHT_GRAY);

在每个组件上,但这似乎容易出错并且乏味。

我想要实现的是:正常的JTextFiels应该像nimbus外观所定义的那样出现。只读字段,例如editable = false,应该有不同的背景颜色。禁用字段应按照nimbus LAF的定义显示。

我在Nimbus style list找不到一个条目

java swing look-and-feel nimbus
2个回答
2
投票

我找不到Nimbus样式列表中的条目

  • 在这种情况下,可以使用标准代码访问密钥,注意Java7中不能访问大多数密钥(从sun.com更改为java.swing),f.i。 JLabel等一半以上的方法
  • 另一种方法是覆盖主要和次要颜色
  • 测试SeaGlass L&F(基于Nimbus),也许所有的键都是固定的,可以设置颜色而不用黑客

来自代码

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics2D;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.Painter;
import javax.swing.UIManager;

public class NimbusTest3 {

    private static final long serialVersionUID = 1L;
    private JFrame frame = new JFrame();
    private JButton button = new JButton("Text");
    private JTextField label = new JTextField("Text");
    private JTextField label1 = new JTextField("Text");

    public NimbusTest3() {
        label.setEnabled(false);
        frame.add(button);
        frame.add(label, BorderLayout.NORTH);
        frame.add(label1, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        try {
            for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(laf.getName())) {
                    UIManager.setLookAndFeel(laf.getClassName());
                    UIManager.getLookAndFeelDefaults().put("TextField[Disabled].backgroundPainter",
                            new FillPainterUI(new Color(127, 255, 191)));
                    UIManager.getLookAndFeelDefaults().put("TextField[Disabled].textForeground", new Color(255, 0, 0));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                NimbusTest3 nimbusTest3 = new NimbusTest3();
            }
        });
    }

    static class FillPainterUI implements Painter<JComponent> {
        // fills whole, available area, ignoring rounded corners, Borders e.i.
        private final Color color;

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

0
投票

如果有人仍然只为不可编辑的JTextField设置bgcolor:

UIDefaults defaults = UIManager.getLookAndFeelDefaults();
defaults.put("TextField[Enabled].backgroundPainter", new NimbusTextFieldBgPainterUI(
  (Color) defaults.get("TextField.disabled"), 
  (Color) defaults.get("TextField.background")));
...
static class NimbusTextFieldBgPainterUI implements Painter<JComponent> {
        private final Color nonEditableBgColor;
        private final Color editableBgColor;

        NimbusTextFieldBgPainterUI(Color cNonEditable, Color cEditable) {
            this.nonEditableBgColor = cNonEditable;
            this.editableBgColor = cEditable;
        }

        @Override
        public void paint(Graphics2D g, JComponent object, int width, int height) {
            Color c;
            if (object instanceof JTextField && !((JTextField) object).isEditable()) {
                c = nonEditableBgColor;
            } else {
                c = editableBgColor;
            }
            g.setColor(c);
            g.fillRect(0, 0, width - 1, height - 1);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.