【问题标题】:How to draw a JPanel as a Nimbus JButton?如何将 JPanel 绘制为 Nimbus JButton?
【发布时间】:2011-12-12 09:16:30
【问题描述】:

在 Nimbus 的外观和感觉中,JButtons 具有非常整洁和准确的外观,带有圆形边框和漂亮的背景。
我想渲染一个具有相同外观的 JPanel(显然它不会有按下状态等)。
我有哪些选择?

【问题讨论】:

    标签: java swing jpanel jbutton nimbus


    【解决方案1】:

    在 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_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);
        }
    

    另请参阅我对How to hide the arrow buttons in a JScrollBar 的回答,了解如何自定义 Nimbus 的外观。有关颜色和画家,请参阅 Nimbus defaults

    【讨论】:

    • 好的,我看过那个问题,很有趣;对于边框,您知道在哪里可以获得与分配给按钮的边框相似的边框吗?
    • @AgostinoX:我认为没有简单的方法来获得相同的外观。您必须在 JPanel 中覆盖 paintComponent 并绘制自己的渐变。
    • 干得好!我唯一不喜欢的是你绘制渐变的方式,你也填充了圆形边框的小角落。如果您使用 gradientSize>20,它是可见的。我试图改进这个(好的)解决方案,并提出一个多级渐变,这也简化了实现。您可以在我的下一条评论中找到它,它是paint 方法的直接替代品,并且仅用对fillRoundRect 的一次调用替换了fillRect 调用。既然答案是你的,如果你想做这个“改进”,那么我会更乐意接受你的答案:-)。
    • 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);
    • @AgostinoX:干得好!我更新了答案并添加了您的代码。
    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2014-01-02
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多