Java Swing Nimbus更改不可编辑JTextField的样式
有没有办法更改不可编辑JTextField的样式?如果文本字段设置为editable=false,我们希望它的背景颜色稍微浅一点。我想有一种方法是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的定义显示 我在列表中找不到条
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字段具有不同的颜色。