Wie lässt sich ein radialer Farbverlauf zeichnen? v.6.0
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);
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);
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);
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);
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);
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
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
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
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.