Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing Nimbus更改不可编辑JTextField的样式_Java_Swing_Look And Feel_Nimbus - Fatal编程技术网

Java Swing Nimbus更改不可编辑JTextField的样式

Java Swing Nimbus更改不可编辑JTextField的样式,java,swing,look-and-feel,nimbus,Java,Swing,Look And Feel,Nimbus,有没有办法更改不可编辑JTextField的样式?如果文本字段设置为editable=false,我们希望它的背景颜色稍微浅一点。我想有一种方法是 readonlyComponent.setBackground(Color.LIGHT_GRAY); 在每一个组件上,但这似乎是容易出错和乏味的 我想要实现的是:正常的JTextfiel应该按照nimbus外观的定义显示。只读字段(例如editable=false)应具有不同的背景色。禁用字段应按照nimbus LAF的定义显示 我在列表中找不到条

有没有办法更改不可编辑JTextField的样式?如果文本字段设置为editable=false,我们希望它的背景颜色稍微浅一点。我想有一种方法是

readonlyComponent.setBackground(Color.LIGHT_GRAY);
在每一个组件上,但这似乎是容易出错和乏味的

我想要实现的是:正常的JTextfiel应该按照nimbus外观的定义显示。只读字段(例如editable=false)应具有不同的背景色。禁用字段应按照nimbus LAF的定义显示

我在列表中找不到条目

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

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

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

  • 要测试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);
        }
    }
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Graphics2D;
导入javax.swing.JButton;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JTextField;
导入javax.swing.Painter;
导入javax.swing.UIManager;
公共类NimbusTest3{
私有静态最终长serialVersionUID=1L;
私有JFrame=新JFrame();
私有JButton按钮=新JButton(“文本”);
私有JTextField标签=新JTextField(“文本”);
私有JTextField label1=新JTextField(“文本”);
公营机构{
label.setEnabled(false);
框架。添加(按钮);
框架。添加(标签,边框布局。北);
添加框架(label1,BorderLayout.SOUTH);
frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
公共静态void main(字符串参数[]){
试一试{
对于(UIManager.LookAndFeelInfo-laf:UIManager.getInstalledLookAndFeels()){
if(“Nimbus”.equals(laf.getName())){
UIManager.setLookAndFeel(laf.getClassName());
UIManager.getLookAndFeelDefaults().put(“TextField[Disabled].backgroundPainter”,
新颜料(新颜色(127255191));
UIManager.getLookAndFeelDefaults().put(“TextField[Disabled].textForeground”,新颜色(255,0,0));
}
}
}捕获(例外e){
e、 printStackTrace();
}
invokeLater(new Runnable()){
@凌驾
公开募捐{
NimbusTest3 NimbusTest3=新的NimbusTest3();
}
});
}
静态类FillPainterUI实现Painter{
//填充整个可用区域,忽略圆角、边框,即。
私人最终颜色;
填充颜料(c色){
颜色=c;
}
@凌驾
公共空白绘制(Graphics2D g、JComponent对象、整型宽度、整型高度){
g、 设置颜色(颜色);
g、 fillRect(0,0,宽度-1,高度-1);
}
}
}

如果仍有人对只为不可编辑的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);
        }
    }
UIDefaults=UIManager.getLookAndFeelDefaults();
defaults.put(“TextField[Enabled].backgroundPainter”,新的NimbusTextFieldBgPainterUI(
(颜色)defaults.get(“TextField.disabled”),
(颜色)defaults.get(“TextField.background”);
...
静态类NimbusTextFieldBgPainterUI实现了Painter{
私人最终颜色不可编辑的颜色;
私有最终颜色可编辑bgcolor;
NimbusTextFieldBgPainterUI(颜色cNonEditable,颜色cEditable){
this.nonEditableBgColor=cNonEditable;
this.editableBgColor=cEditable;
}
@凌驾
公共空白绘制(Graphics2D g、JComponent对象、整型宽度、整型高度){
颜色c;
if(JTextField&&!((JTextField)object.isEditable()的对象实例){
c=不可编辑的颜色;
}否则{
c=可编辑的颜色;
}
g、 setColor(c);
g、 fillRect(0,0,宽度-1,高度-1);
}
}

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