【问题标题】:Swing Nimbus change style of a non editable JTextFieldSwing Nimbus 更改不可编辑 JTextField 的样式
【发布时间】:2014-04-03 10:16:07
【问题描述】:

有没有办法改变不可编辑的 JTextField 的样式?如果将 TextField 设置为可编辑 = false,我们希望为 TextField 提供稍微偏灰的背景。我想一种方法是

readonlyComponent.setBackground(Color.LIGHT_GRAY);

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

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

我在Nimbus style list 中找不到条目

【问题讨论】:

    标签: java swing look-and-feel nimbus


    【解决方案1】:

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

    • 在这种情况下,可以从标准代码访问键,请注意大多数键在 Java7 中无法访问(从 sun.com 更改为 java.swing),f.i. JLabel 等超过一半的方法。

    • 另一种方法是覆盖主要颜色和次要颜色

    • 测试 SeaGlass L&F(基于 Nimbus),可能所有键都已修复,并且可以在没有 hack 的情况下设置颜色

    来自代码

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

    【讨论】:

    • 你不应该扩展实现PainterAbstractRegionPainter吗?
    • @user1803551 :-) 在我的评论中 // 填充整个可用区域,忽略圆角 e.i.
    • 也许我忽略了一些东西,但 TextField[Disabled] 不是用于禁用状态吗?我想更改可编辑样式。
    • @morpheus05 for JTextField with setEditable(false);是否有与未触及的 JTextField 相同的键,覆盖 TextField.foreground 和 TextField.background
    • 我重写了我的问题。我只希望 editable = false 字段具有不同的颜色。
    【解决方案2】:

    如果有人仍然对只为不可编辑的 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);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 2012-02-08
      相关资源
      最近更新 更多