Wie lässt sich ein radialer Farbverlauf zeichnen? v.6.0

Das Beispiel demonstriert, wie sich ein JPanel mit einem von Blau nach Gelb verlaufenden radialen Hintergrund versehen lässt. Durch Anpassung mehrerer Parameter lässt sich der Verlauf vielfach beeinflussen.

Die Klasse RadialGradient ist von JFrame abgeleitet und enthält die main -Methode. In ihrem Konstruktor wird ein Objekt der zweiten hier gezeigten Klasse RoundGradientPanel gebildet und dem Frame hinzugefügt. Zur Demonstration wird noch ein hier funktionsloser Button auf das Panel gesetzt. Der Frame wird in der Größe angepasst und sichtbar gemacht.

Die Klasse RoundGradientPanel ist von JPanel abgeleitet. In ihr wird dessen von JComponent geerbte Methode paintComponent() überschrieben. Sie ist für die Erscheinung des Panels zuständig.
Vereinfacht gesagt wird hier ein Rechteck in Panel-Größe mit einem Farbverlauf neu gezeichnet. Dies geschieht so, dass zunächst das als Parameter übergebene Graphics -Objekt kopiert und in ein Graphics2D -Objekt gecastet wird. In der Folge werden Breite und Höhe des Panels ermittelt und das Zentrum des Verlaufs, ein Point2D-Objekt, gebildet. Mit Zentrum ist hier, vereinfacht gesagt, der Mittelpunkt des äußeren Farbkreises gemeint.
Der als float angegebene Radius bezeichnet die Strecke, auf der der komplette Verlauf einmal erscheint. Ein weiteres, optionales Point2D-Objekt, hier in Anlehnung an die Java-Dokumentation als focus bezeichnet, gibt die Lage des Mittelpunktes der ersten Farbe an. Hierdurch ist es möglich, den Verlauf exzentrisch zu gestalten.
Die Farben, sowie deren Verlaufsbreite wird in zwei Arrays angegeben. Diesen Parametern wird noch ein Enum-Wert vom Typ MultipleGradientPaint.CycleMethod mitgegeben. Nach Erzeugen des Gradienten wird dieser dem Graphics2D -Objekt übergeben und schließlich das Rechteck in der Größe des Panels gezeichnet.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.MultipleGradientPaint.CycleMethod;
import java.awt.RadialGradientPaint;
import java.awt.geom.Point2D;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class RadialGradient extends JFrame {

    public RadialGradient() {
        RoundGradientPanel gp = new RoundGradientPanel();
        gp.add(new JButton("click"));
        gp.setPreferredSize(new Dimension(200, 200));
        this.add(gp, BorderLayout.CENTER);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setLocationRelativeTo(null);
        this.setTitle("Frame-Titel");
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new RadialGradient();
    }
}

class RoundGradientPanel extends JPanel {

    public RoundGradientPanel() {
        super();
        setOpaque(true);
    }

    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g.create();
        int w = getWidth(), h = getHeight();
        Point2D center = new Point2D.Float(w / 2, h / 2);
        float radius = w / 4;
        float[] dist = { 0.0f, 0.5f, 1.0f };
        Point2D focus = new Point2D.Float(w / 2, h / 2);
        Color[] colors = { Color.BLUE, Color.GREEN, Color.YELLOW };
        RadialGradientPaint rgp = new RadialGradientPaint(center, radius,
                focus, dist, colors, CycleMethod.NO_CYCLE);
        g2d.setPaint(rgp);
        g2d.fillRect(0, 0, w, h);
    }
}

Zur Demonstration hier einige Parameterlisten mit den entsprechenden Screenshots der Ergebnisse. Die rot gekennzeichneten Werte illustrieren die Änderungen im Vergleich zur jeweils ersten Version des Abschnitts.

Gradienten ohne Focus-Angabe:

Point2D center = new Point2D.Float(w / 2, h / 2);
float radius = w / 2;
float[] dist = { 0.0f, 0.5f, 1.0f };
Color[] colors = { Color.BLUE, Color.GREEN, Color.YELLOW };
RadialGradientPaint rgp = new RadialGradientPaint(center,
radius, dist, colors, CycleMethod.NO_CYCLE);

Radialer Gradient 1

Point2D center = new Point2D.Float(w / 2, h / 2);
float radius = w / 2;
float[] dist = { 0.0f, 0.1f, 1.0f };
Color[] colors = { Color.BLUE, Color.GREEN, Color.YELLOW };
RadialGradientPaint rgp = new RadialGradientPaint(center,
radius, dist, colors, CycleMethod.NO_CYCLE);

Radialer Gradient 2

Point2D center = new Point2D.Float(20, h / 2);
float radius = w / 2;
float[] dist = { 0.0f, 0.5f, 1.0f };
Color[] colors = { Color.BLUE, Color.GREEN, Color.YELLOW };
RadialGradientPaint rgp = new RadialGradientPaint(center,
radius, dist, colors, CycleMethod.NO_CYCLE);

Radialer Gradient 3

Gradienten mit Focus-Angabe:

Point2D center = new Point2D.Float(w / 2, h / 2);
float radius = w / 2;
float[] dist = { 0.0f, 0.5f, 1.0f };
Point2D focus = new Point2D.Float(w / 2, h / 2);
Color[] colors = { Color.BLUE, Color.GREEN, Color.YELLOW };
RadialGradientPaint rgp = new RadialGradientPaint(center,
radius, focus, dist, colors, CycleMethod.NO_CYCLE);

Radialer Gradient 4

Point2D center = new Point2D.Float(w / 2, h / 2);
float radius = w / 2;
float[] dist = { 0.0f, 0.5f, 1.0f };
Point2D focus = new Point2D.Float(20, h / 2);
Color[] colors = { Color.BLUE, Color.GREEN, Color.YELLOW };
RadialGradientPaint rgp = new RadialGradientPaint(center,
radius, focus, dist, colors, CycleMethod.NO_CYCLE);

Radialer Gradient 5

Die Angaben der Verlaufsmethode:

Point2D center = new Point2D.Float(w / 2, h / 2);
float radius = w / 4;
float[] dist = { 0.0f, 0.5f, 1.0f };
Point2D focus = new Point2D.Float(w / 2, h / 2);
Color[] colors = { Color.BLUE, Color.GREEN, Color.YELLOW };
RadialGradientPaint rgp = new RadialGradientPaint(center,
radius, focus, dist, colors, CycleMethod.NO_CYCLE

Radialer Gradient 6

Point2D center = new Point2D.Float(w / 2, h / 2);
float radius = w / 4;
float[] dist = { 0.0f, 0.5f, 1.0f };
Point2D focus = new Point2D.Float(w / 2, h / 2);
Color[] colors = { Color.BLUE, Color.GREEN, Color.YELLOW };
RadialGradientPaint rgp = new RadialGradientPaint(center,
radius, focus, dist, colors, CycleMethod.REFLECT

Radialer Gradient 6

Point2D center = new Point2D.Float(w / 2, h / 2);
float radius = w / 4;
float[] dist = { 0.0f, 0.5f, 1.0f };
Point2D focus = new Point2D.Float(w / 2, h / 2);
Color[] colors = { Color.BLUE, Color.GREEN, Color.YELLOW };
RadialGradientPaint rgp = new RadialGradientPaint(center,
radius, focus, dist, colors, CycleMethod.REPEAT

Radialer Gradient 7

Der Konstruktor des RadialGradientPaint ist mehrfach überladen. Neben den Angaben der float -Koordinaten von Start- und Endpunkten können hierfür auch Point -Objekte verwendet werden.