Java 如何将JPanel绘制为Nimbus JButton?

Java 如何将JPanel绘制为Nimbus JButton?,java,swing,jpanel,jbutton,nimbus,Java,Swing,Jpanel,Jbutton,Nimbus,在Nimbus look and feel中,JButtons具有非常整洁和准确的外观,具有圆形边框和漂亮的背景 我想渲染一个具有相同外观的JPanel(显然它没有按下状态等) 我的选择是什么?在JPanel上获得“按钮外观”的最简单方法可能是扩展JPanel并覆盖paintComponent 这是NimbusJButton外观: 下面是我在JPanel上实现的类似外观(我在周围添加了一个空白边框以显示此示例,并且角不是半透明的): 这是我的代码(使用): 更新 这里是AgostinoX改进

在Nimbus look and feel中,JButtons具有非常整洁和准确的外观,具有圆形边框和漂亮的背景
我想渲染一个具有相同外观的JPanel(显然它没有按下状态等)
我的选择是什么?

在JPanel上获得“按钮外观”的最简单方法可能是扩展
JPanel
并覆盖
paintComponent

这是Nimbus
JButton
外观:

下面是我在
JPanel
上实现的类似外观(我在周围添加了一个空白边框以显示此示例,并且角不是半透明的):

这是我的代码(使用):

更新

这里是AgostinoX改进的
paintComponent
方法,它解决了我代码中的问题

    @Override
    public void paintComponent(Graphics g) {

        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALI‌​AS_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);
    }

另请参见我对如何定制Nimbus外观的回答。看看颜色和画家的答案。

好的,我看了这个问题,很有趣;对于边框,你知道在哪里可以买到与按钮相似的吗?@AgostinoX:我认为没有简单的方法可以得到相同的外观。您必须在
JPanel
中覆盖
paintComponent
,并绘制自己的渐变。干得好!我唯一不喜欢的是,你画渐变的方式,你也会填充圆边的小角落。如果使用gradientSize>20,则该选项可见。我试图改进这个(好的)解决方案,并提出了一个多站渐变,这也简化了实现。您可以在我的下一篇评论中找到它,它是paint方法的一个替代品,并用一个对fillRoundRect的调用来替换fillRect调用。既然答案是你的,如果你想做这个“改进”,那么我会更乐意接受你的答案:-);g2.setRenderingHint(RenderingHits.KEY_ANTIALIAS,RenderingHits.VALUE_ANTIALIAS_ON);float gradientPerc=(float)gradientSize/getHeight();LinearGradientPaint lgp=新的LinearGradientPaint(0,0,getHeight()-1,新浮点[]{0,gradientPerc,1-gradientPerc,1f},新颜色[]{lighterColor,darkerColor,darkerColor,lighterColor});g2.setPaint(lgp);g、 fillRoundRect(0,0,getWidth()-1,getHeight()-1,gradientSize,gradientSize);g2.setColor(edgeColor);g2.设定行程(边行程);g、 drawRoundRect(0,0,getWidth()-1,getHeight()-1,gradientSize,gradientSize)@阿戈斯蒂诺克斯:干得好!我更新了我的答案并添加了你的代码。
    @Override
    public void paintComponent(Graphics g) {

        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALI‌​AS_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);
    }