【发布时间】:2011-12-12 09:16:30
【问题描述】:
在 Nimbus 的外观和感觉中,JButtons 具有非常整洁和准确的外观,带有圆形边框和漂亮的背景。
我想渲染一个具有相同外观的 JPanel(显然它不会有按下状态等)。
我有哪些选择?
【问题讨论】:
标签: java swing jpanel jbutton nimbus
在 Nimbus 的外观和感觉中,JButtons 具有非常整洁和准确的外观,带有圆形边框和漂亮的背景。
我想渲染一个具有相同外观的 JPanel(显然它不会有按下状态等)。
我有哪些选择?
【问题讨论】:
标签: java swing jpanel jbutton nimbus
在 JPanel 上获得“按钮外观”的最简单方法可能是扩展 JPanel 并覆盖 paintComponent。
这是 Nimbus JButton 看:
这是我在JPanel 上实现的类似外观(我在周围添加了一个空边框以显示此示例,并且角落不是半透明的):
这是我的代码(使用gradients):
public class ColorDemo extends JPanel {
private final int gradientSize = 18;
private final Color lighterColor = new Color(250, 250, 250);
private final Color darkerColor = new Color(225, 225, 230);
private final Color edgeColor = new Color(140, 145, 145);
private final Stroke edgeStroke = new BasicStroke(1);
private final GradientPaint upperGradient = new GradientPaint(
0, 0, lighterColor,
0, gradientSize, darkerColor);
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
GradientPaint lowerGradient = new GradientPaint(
0, getHeight()-gradientSize-1, darkerColor,
0, getHeight(), lighterColor);
g2.setPaint(upperGradient);
g2.fillRect(0, 0, getWidth()-1 , gradientSize);
g2.setPaint(darkerColor);
g2.fillRect(0, gradientSize, getWidth()-1, getHeight()-gradientSize-1);
g2.setPaint(lowerGradient);
g2.fillRect(0, getHeight()-gradientSize, getWidth()-1, getHeight()-1);
g2.setStroke(edgeStroke);
g2.setPaint(edgeColor);
g2.drawRoundRect(0, 0, getWidth()-1, getHeight()-1,
gradientSize/2, gradientSize/2);
}
}
更新
这是 AgostinoX 改进的paintComponent 方法,它解决了我的代码中的角落问题。
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
float gradientPerc = (float)gradientSize/getHeight();
LinearGradientPaint lgp = new LinearGradientPaint(0,0,0,getHeight()-1,
new float[] {0, gradientPerc, 1-gradientPerc, 1f},
new Color[] {lighterColor, darkerColor, darkerColor, lighterColor});
g2.setPaint(lgp);
g.fillRoundRect(0, 0, getWidth()-1, getHeight()-1,
gradientSize, gradientSize);
g2.setColor(edgeColor);
g2.setStroke(edgeStroke);
g.drawRoundRect(0, 0, getWidth()-1, getHeight()-1,
gradientSize, gradientSize);
}
另请参阅我对How to hide the arrow buttons in a JScrollBar 的回答,了解如何自定义 Nimbus 的外观。有关颜色和画家,请参阅 Nimbus defaults。
【讨论】:
JPanel 中覆盖 paintComponent 并绘制自己的渐变。