【问题标题】:JPanel gradient backgroundJPanel 渐变背景
【发布时间】:2023-11-10 15:14:02
【问题描述】:

我用谷歌搜索但找不到正确的答案。我有一个JPanel,我希望它有一个从上到下的渐变。我只会使用两种颜色。我怎样才能做到这一点?

【问题讨论】:

标签: java swing awt jpanel gradient


【解决方案1】:

给你:

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 很好的例子,虽然我建议覆盖JPanelgetPreferredSize() 并在JFrame 上调用pack() 而不是调用setSize(..)
  • @DavidKroukamp setSize() 调用是为了在屏幕上显示某些内容。在这种情况下,我不想覆盖 getPreferredSize(),因为我的理解是 Panel 稍后将实际用于设置 LayoutManager 并添加组件,因此,getPreferredSize() 应该由该 LayoutManager 计算,而不是任意大小.无论如何,这只是吹毛求疵,我相信这两种解决方案都是可以接受的。
  • 我个人更喜欢LinearGradientPaint,但也要看需求;)
  • @MadProgrammer 还没有机会看。上次我必须使用 Java 5 进行设置,但 LinearGradientPaint 从 1.6 开始才存在。感谢您的更新。
  • @GuillaumePolet 我认为GradientPaint 对于两种颜色渐变更快,LinearGradientPaint 只允许更多颜色;)
【解决方案2】:

你可以用这个:

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()); 

        }

    };

希望有所帮助; 您还可以返回此文章获取更多帮助: Gradient background to any jcomponent

【讨论】:

  • 我打电话给 BS。很高兴您足够诚实以链接到源。但是,源代码是正确的,而您以错误的方式对其进行了修改。提示:JComponent.setOpaque(false); 是一个关键因素,super.paintComponent(grphcs); 必须是最后一次调用。否则,您的代码将无法与所有 JComponent 对象一起使用,而且对于任何未来的更改也不可靠。但感谢您的指点。