当前位置: 首页 > 知识库问答 >
问题:

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

纪俊良
2023-03-14

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

readonlyComponent.setBackground(Color.LIGHT_GRAY);

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

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

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

共有2个答案

唐繁
2023-03-14

如果仍有人对只为不可编辑的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);
        }
    }
贾俊艾
2023-03-14

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

>

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

测试SeaGlass L

来自代码

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);
        }
    }
}
 类似资料:
  • 给我的Laravel 5.1网站一个可编辑的镜头。我有一个列表的文本标题列为表行。我跟着留档。当我点击标题时,我可以看到文本字段的编辑表单弹出。我更改文本并提交。新文本显示,弹出窗口按预期消失。但是数据库没有更新。我确保将data-url设置为我需要的后期操作。确保为它添加路线。确保在我的控制器中有一个方法来处理请求、更新数据库和重定向(不确定重定向是否必要)。这是一个单行的片段,为了简单起见,我

  • 我正试图在一个需要过滤非数字字符和点的编辑文本上实现一个过滤器。我可以使用编辑文本或输入类型的数字标签,但似乎设备之间有轻微的差异,就像有些设备即使在编辑文本中过滤它们也显示点字符。 下面是afterTextChanged方法 这是输出结果 如您所见,在我删除第一个“h”后,当我输入另一个h时,字符串变为“66hh”,其中它应该是“66h”,因为我已经删除了第一个h。什么原因会阻止我对可编辑的更改

  • 我在~/.bashrc和/etc/environment中更改了JAVA_HOME,并提供了它的源代码。这导致JAVA_HOME发生更改。 然而,我的java版本仍然保持显示早期版本。 最后,运行下面的代码为我提供了符号链接,它将我指向系统正在使用的实际java可执行文件。我把它编辑到我下载的Java8中,现在我的java版本显示了正确的版本。 我的问题是: 如果这是唯一导致更改的编辑,那么我们为

  • 我有一系列基于用户选择的EditText单元格,其中一些单元格将自动填充,然后我通过执行“myCell[x].setEnabled(false)”将这些EditText单元格更改为不可编辑。在这种情况下,字体颜色变为灰色,可读性不好。有没有一种方法可以改变EditText字体的颜色。setEnabled(false)或是否有其他方法通过对字体类型和颜色的更多控制来禁用单元格的可编辑性?我可以改变背

  • 在阅读了大量涉及setOnEditCommit的可编辑TableView解决方案后,我今天对Oracle非常生气,这不是正确的方法。 以下是我在挖掘JavaFX源代码后发现的一个更好、更简单的解决方案:

  • 问题内容: 我有一个.xlsx文件要编辑,我发现openpyxl可以操纵Excel 2007文件。我只想更改某些单元格中的值,并保持其他设置不变。 但是在阅读了文档之后,我找不到用于编辑现有文件的示例。它仅演示了读取.xlsx文件并写入新文件。 我尝试通过以下方式编辑现有文件,但保存后,文件中的样式已删除(如字体,颜色): 问题答案: 现在,openpyxl无法处理足够好的样式,因此我尝试使用py