如何使JPanel的背景渐变色?

6
我想知道如何制作另一个JPanel中的背景渐变。虽然互联网上有很多文章,但它们都演示了如何覆盖JPanel的paintComponent()方法,而不是如何处理其中的JPanel。
我使用Netbeans IDE。我创建了一个新的JPanel类并重写了它的paintComponent()方法。我在其上还有另一个jpanel(拖放到父JPanel上)。我想使它的背景渐变。

这是我为父面板尝试的方法。它起作用了。如何为子JPanel覆盖它呢?

public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        Color color1 = getBackground();
        Color color2 = color1.darker();
        int w = getWidth();
        int h = getHeight(); 
        GradientPaint gp = new GradientPaint(
                0, 0, color1,
                0, h, color2);

        g2d.setPaint(gp);
        g2d.fillRect(0, 0, w, h);
        }

1
你需要在另一个继承了 JPanel 的类中使用这段代码。据我所知,父组件无法更改其子组件的绘制方式。因此,为你的子组件扩展 JPanel 并将此处的代码放入子面板中。 - Brian
@Brian,谢谢。其他JComponents(需要覆盖其方法)也是这样吗? - Débora
жүҖжңүзҡ„JComponentзұ»йғҪжңүиҝҷдёӘpaintComponentж–№жі•пјҢжүҖд»ҘжҳҜзҡ„гҖӮ - Brian
1
@AashMaharoon 对于某些组件,您可以使用 setOpaque(false) 将它们的背景设置为透明,这样父组件绘制的内容仍然可见于子组件内部。 - josefx
2个回答

12
如果您仔细调用super.paintComponent(g),则可以直接将渐变添加到面板中,如下所示。
为了提高可用性,我建议不要尝试使各个组件透明。还要注意,透明度由外观控制。 GradientPanel
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
* @see https://dev59.com/qmfWa4cB1Zd3GeqPlu_2
*/
public class GradientPanel extends JPanel {

    private static final int N = 32;

    public GradientPanel() {
        this.setBorder(BorderFactory.createEmptyBorder(N, N, N, N));
        this.add(new JLabel("Test:", JLabel.CENTER));
        this.add(new JTextField("This is a test."));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        Color color1 = getBackground();
        Color color2 = color1.darker();
        int w = getWidth();
        int h = getHeight();
        GradientPaint gp = new GradientPaint(
            0, 0, color1, 0, h, color2);
        g2d.setPaint(gp);
        g2d.fillRect(0, 0, w, h);
    }

    private void display() {
        JFrame f = new JFrame("GradientPanel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new GradientPanel().display();
            }
        });
    }
}

感谢您的回答。您提到的内容已经在我的父JPanel中实现了(代码也在我的问题中提到)。我想问的是,假设需要将另一个JPanel添加到您的“GradientPanel”中,并使其背景呈渐变效果。那么该如何实现? - Débora
啊,你想改变一个没有源代码访问权限的 JPanel 的背景。你可以使用 UIManager.put() 来提供自己的 PanelUI,并使用自定义实现的 paint() 方法。 - trashgod

1
我想这是你试图做的事情。
jPanel1 = new 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();
                int h = getHeight();
                Color color1 = new Color(81,80,106);
                Color color2 = new Color(165,164,241);
                GradientPaint gp = new GradientPaint(0, 0, color1, 0, h, color2);
                g2d.setPaint(gp);
                g2d.fillRect(0, 0, w, h);
            }
        };

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