JPanel渐变背景

10

我搜索了一下,但没有找到正确的答案。我有一个JPanel,我想让它从上到下有一个渐变效果。我只想使用两种颜色。我该如何实现?


http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/GradientPaint.html - Mike G
2个回答

19

给你:

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestPanel extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        int w = getWidth(), h = getHeight();
        Color color1 = Color.RED;
        Color color2 = Color.GREEN;
        GradientPaint gp = new GradientPaint(0, 0, color1, w, h, color2);
        g2d.setPaint(gp);
        g2d.fillRect(0, 0, w, h);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                TestPanel panel = new TestPanel();
                frame.add(panel);
                frame.setSize(200, 200);
                frame.setLocationRelativeTo(null);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

+1дёӘеҫҲеҘҪзҡ„дҫӢеӯҗпјҢдёҚиҝҮжҲ‘е»әи®®иҰҶзӣ–JPanelзҡ„getPreferredSize()ж–№жі•пјҢ并еңЁJFrameдёҠи°ғз”Ёpack()иҖҢдёҚжҳҜи°ғз”ЁsetSize(..)ж–№жі•гҖӮ - David Kroukamp
@DavidKroukamp setSize() 调用是为了在屏幕上显示一些东西。在这种情况下,我不想覆盖 getPreferredSize(),因为我的理解是该面板稍后将实际用于设置布局管理器并添加组件,因此 getPreferredSize() 应由该布局管理器计算而不是任意大小。无论如何,这只是挑剔,我相信两种解决方案都是可以接受的。 - Guillaume Polet
1
我个人更喜欢使用LinearGradientPaint,但这取决于需求 ;) - MadProgrammer
这段代码并不适用于所有的 JComponent 对象。Mohammed Sayed 提供了一种通用的方法,通过设置原始对象的不透明度并将其作为最后一个操作进行绘制:http://www.javarichclient.com/how-to-add-a-gradient-background-to-any-jcomponent/ - class stacker
@ClassStacker 不确定你的评论与原问题有何关联,也不知道为什么你会对这个答案进行负评。 - Guillaume Polet
显示剩余4条评论

4
你可以使用这个:
JPanel contentPane = new JPanel() {
        @Override
        protected void paintComponent(Graphics grphcs) {
            super.paintComponent(grphcs);
            Graphics2D g2d = (Graphics2D) grphcs;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            GradientPaint gp = new GradientPaint(0, 0,
                    getBackground().brighter().brighter(), 0, getHeight(),
                    getBackground().darker().darker());
            g2d.setPaint(gp);
            g2d.fillRect(0, 0, getWidth(), getHeight()); 

        }

    };

希望能帮到您;您还可以返回这篇文章获取更多帮助:如何给任何J组件添加渐变背景


2
我对此提出质疑。你能够诚实地提供源链接是好事。然而,源代码是正确的,而你修改的方式是错误的。提示:JComponent.setOpaque(false); 是一个关键因素,而 super.paintComponent(grphcs); 需要是最后一次调用。否则,你的代码将无法与所有 JComponent 对象一起使用,并且在未来的任何更改方面都不够健壮。但还是感谢你的指引。 - class stacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接