我的程序中有两个按钮
JButton button1 = new JButton(); button1.setText("First Button"); JButton button2 = new JButton("Second Button");
我尝试更改按钮的LaF,我可以使用以下代码更改按钮背景色
UIManager.put(Button.background new color(134,201,236));
但是,当我尝试更改其他键值(如)时"Button.disabled","Button[Default+Focused+Pressed].backgroundPainter"代码对我不起作用。有人可以帮助我如何更改使用Painter的默认键值吗?
"Button.disabled"
"Button[Default+Focused+Pressed].backgroundPainter"
要爱雨云。
首先,您将要保持这些值接近…
Button.background = DerivedColor(color=214,217,223 parent=control offsets=0.0,0.0,0.0,0 pColor=214,217,223 Button.contentMargins = javax.swing.plaf.InsetsUIResource[top=6,left=14,bottom=6,right=14] Button.defaultButtonFollowsFocus = false Button.disabled = DerivedColor(color=214,217,223 parent=control offsets=0.0,0.0,0.0,0 pColor=214,217,223 Button.disabledText = DerivedColor(color=142,143,145 parent=nimbusDisabledText offsets=0.0,0.0,0.0,0 pColor=142,143,145 Button.focusInputMap = javax.swing.plaf.InputMapUIResource@70e4bd3a Button.font = javax.swing.plaf.FontUIResource[family=SansSerif,name=sansserif,style=plain,size=12] Button.foreground = DerivedColor(color=0,0,0 parent=text offsets=0.0,0.0,0.0,0 pColor=0,0,0 ButtonUI = javax.swing.plaf.synth.SynthLookAndFeel Button[Default+Focused+MouseOver].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@3e5d2085 Button[Default+Focused+Pressed].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@78662669 Button[Default+Focused].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@2988e80b Button[Default+MouseOver].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@7c508d6d Button[Default+Pressed].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@2b5ec36a Button[Default+Pressed].textForeground = DerivedColor(color=255,255,255 parent=nimbusSelectedText offsets=0.0,0.0,0.0,0 pColor=255,255,255 Button[Default].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@62c2ed06 Button[Disabled].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@c6499e5 Button[Disabled].textForeground = DerivedColor(color=142,143,145 parent=nimbusDisabledText offsets=0.0,0.0,0.0,0 pColor=142,143,145 Button[Enabled].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@742746e1 Button[Focused+MouseOver].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@293f9e9c Button[Focused+Pressed].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@5ce0ec60 Button[Focused].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@7463fda8 Button[MouseOver].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@3a3dad8b Button[Pressed].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@6f231f2e
这些基本上是Nimbus用来绘制标准按钮的默认键/值。
基本上,您要做的就是提供自己的Painter,例如…
Painter
public class ButtonPainter implements Painter { private Color light, dark; private GradientPaint gradPaint; public ButtonPainter(Color light, Color dark) { this.light = light; this.dark = dark; } @Override public void paint(Graphics2D g, Object c, int w, int h) { System.out.println("..."); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); gradPaint = new GradientPaint((w / 2.0f), 0, light, (w / 2.0f), (h / 2.0f), dark, true); g.setPaint(gradPaint); g.fillRect(2, 2, (w - 5), (h - 5)); Color outline = new Color(0, 85, 0); g.setColor(outline); g.drawRect(2, 2, (w - 5), (h - 5)); Color trans = new Color(outline.getRed(), outline.getGreen(), outline.getBlue(), 100); g.setColor(trans); g.drawRect(1, 1, (w - 3), (h - 3)); } }
然后替换UIManager值
UIManager
UIManager.getLookAndFeelDefaults().put("Button[Enabled].backgroundPainter", new ButtonPainter(Color.YELLOW, Color.RED)); UIManager.getLookAndFeelDefaults().put("Button[Focused].backgroundPainter", new ButtonPainter(Color.YELLOW, Color.RED));
例如…
import java.awt.Color; import java.awt.EventQueue; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.GridBagLayout; import java.awt.RenderingHints; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.Painter; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.plaf.ColorUIResource; public class TestNimbus { public static void main(String[] args) { new TestNimbus(); } public TestNimbus() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } System.out.println(UIManager.get("Button[Default+Focused].backgroundPainter")); UIManager.getLookAndFeelDefaults().put("Button[Enabled].backgroundPainter", new ButtonPainter(Color.YELLOW, Color.RED)); UIManager.getLookAndFeelDefaults().put("Button[Focused].backgroundPainter", new ButtonPainter(Color.YELLOW, Color.RED)); System.out.println(UIManager.get("Button[Default+Focused].backgroundPainter")); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new GridBagLayout()); frame.add(new JButton("First Button")); frame.add(new JButton("Second Button")); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class ButtonPainter implements Painter { private Color light, dark; private GradientPaint gradPaint; public ButtonPainter(Color light, Color dark) { this.light = light; this.dark = dark; } @Override public void paint(Graphics2D g, Object c, int w, int h) { System.out.println("..."); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); gradPaint = new GradientPaint((w / 2.0f), 0, light, (w / 2.0f), (h / 2.0f), dark, true); g.setPaint(gradPaint); g.fillRect(2, 2, (w - 5), (h - 5)); Color outline = new Color(0, 85, 0); g.setColor(outline); g.drawRect(2, 2, (w - 5), (h - 5)); Color trans = new Color(outline.getRed(), outline.getGreen(), outline.getBlue(), 100); g.setColor(trans); g.drawRect(1, 1, (w - 3), (h - 3)); } } }
这是全局更改,因此所有按钮都将受到此更改的影响。我相信有一种方法可以做到,只有要更改的控件才会受到影响,但是您需要自己进行一些研究;)