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);
        }
4

2 に答える 2

12

注意して を呼び出すsuper.paintComponent(g)と、以下に示すようにグラデーションをパネルに直接追加できます。

使いやすさのために、個々のコンポーネントを透明にしようとする誘惑に抵抗します。不透明度はルック アンド フィールによって制御されることにも注意してください。

グラデーションパネル

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 http://stackoverflow.com/q/12220853/230513
*/
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();
            }
        });
    }
}
于 2012-08-31T20:26:14.230 に答える