有没有办法改变不可编辑的JTextField的样式?如果设置为editable = false,我们想给TextField一个稍微浅灰色的背景。我想有一种方法
readonlyComponent.setBackground(Color.LIGHT_GRAY);
在每个组件上,但这似乎容易出错并且乏味。
我想要实现的是:正常的JTextFiels应该像nimbus外观所定义的那样出现。只读字段,例如editable = false,应该有不同的背景颜色。禁用字段应按照nimbus LAF的定义显示。
我在Nimbus style list找不到一个条目
我找不到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);
}
}
}
如果有人仍然只为不可编辑的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);
}
}