Gradient Hintergrund malen und durchscheinen lassen

Lequ

Mitglied
Hallo Zusammen,

ich baue gerade eine Oberfläche für eine Gui Anwendung. Dabei dachte ich mir, der schnöde, graue Hintergrund ist mir auf Dauer zu langweilig. Da wollte ich einen Kreis-Farbübergang (RadialGradientPaint) über den ganzen Hintergrund malen. Soweit die Theorie.

Problem dabei ist, der Hintergrund wird von irgend etwas überlagert. Der Panel der dem Frame hinzugefügt wurde ist schon auf setOpaque(false), ist jedoch komplett ohne Effekt diese Zeile.

Wenn die Zeile super.paint(g) auskommentiert wird, kann man sehen, wie es aussehen soll. Nur darüber sollen die restlichen Komponenten eben auch gezeigt werden.

Das witzige ist folgendes: während dem Resizing vom Fenster wird der Hintergrund gezeichnet, sobald das resizing fertig ist, kommt wieder der Vordergrund, flackert also ganz hübsch...

Weiß jemand woran das liegt?

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RadialGradientPaint;
import java.awt.geom.Point2D;

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

@SuppressWarnings("serial")
public class Test extends JFrame{

	public Test(){
		setSize(400,300);
		setVisible(true);
		JPanel middlePanel = new JPanel();
		middlePanel.setOpaque(false);
		middlePanel.add(new JButton("I am legend"));
		add(middlePanel);
	}
	
	public void paint(Graphics g) {
		Point2D center = new Point2D.Float(getWidth() / 2, getHeight() / 3);
		float radius = Math.max(getWidth(), getHeight()) / 2;
		float[] dist = { 0.0f, 1.0f };
		Color[] colors = { Color.white, Color.blue };
		RadialGradientPaint gradientPaint = new RadialGradientPaint(center, radius, dist, colors);
		
		Graphics2D g2d = (Graphics2D) g;
		g2d.setPaint(gradientPaint);
		g2d.fillRect(0, 0, getWidth(), getHeight());

		super.paint(g); // diese Zeile zum Test auskommentieren
        }
	
	public static void main(String[] args) {
		new Test();
	}

}

Viele Grüße
 
V

vanny

Gast
Überschreib die paintComponent(); von einem JPanel und adde das auf den JFrame.

Gruß Vanny
 

Lequ

Mitglied
@vanny: gibt es einen Unterschied ob ich paint überschreibe, was eignes zeichne und dann super.paint aufrufe oder ich das Ganze mit paintComponent mache? Meines Wissens ruft paint ja nur paintcomponents, paintchildren und paintborder auf (keine Gewähr bei der Reihenfolge ;) )

Mit dem neuen BackgroundPanel der das Zeichnen übernimmt funktionierts dann auch.

@JavaProfi: ich dachte wohl, wenn ich das obere Panel durchsichtig mache kommt der Hintergrund durch. Meiner jetzigen Vermutung nach ist das Problem, das der paint-Aufruf danach ein clearRect drinne hat und somit mein Hintergrund ziemlich unnötig ist. Der zusätzliche Panel übermalt den Hintergrund innerhalb seiner paint bzw paintcomponent wohl nicht. Hab ich das soweit richtig aufgefasst? ;)

Grüße
 

GUI-Programmer

Top Contributor
Lequ hat gesagt.:
gibt es einen Unterschied ob ich paint überschreibe, was eignes zeichne und dann super.paint aufrufe oder ich das Ganze mit paintComponent mache? Meines Wissens ruft paint ja nur paintcomponents, paintchildren und paintborder auf (keine Gewähr bei der Reihenfolge )

Bis aufs nur, ja, stimmt. Wenn du es genau wissen willst, dann schau dir einfach mal den Code an im src.zip deines jdks

Außerdem weisst du ja sicherlich, dass zuerst das gezeichnet wird, was auch zuerst im Code steht, wäre ja auch blöd, wenn nicht. Wenn du somit paintComponent überschreibst solltest du auch erst die super Methode aufrufen. Danach kannst du auf deiner Komponente sonst noch was weiterzeichnen. Würdest du das in der paint-Methoden machen, dann würde dies imo auch gezeichnet selbst wenn sich weitere Kindskomponenten in deiner Zeichenkomponente befänden.
 

Lequ

Mitglied
Wenn du somit paintComponent überschreibst solltest du auch erst die super Methode aufrufen.


Das war genau der Gedanke, der für mich Falsch war. Denn ich will ja den Hintergrund zeichnen und danach alles andere darüber. Wenn ich erst alles zeichnen lasse und dann den Hintergrund male, gibt es ja keinen Vordergrund mehr.

Was meiner Ansicht nach nun mein Problem gelöst hat ist die Tatsache, dass im paint von einem JPanel, im Gegensatz zum JFrame, kein eingener Hintergrund gemalt wird, der meinen zuvor gezeichneten Hintergrund übermalt. Stimmt diese Annahme?
 

GUI-Programmer

Top Contributor
Versteh ich jetzt nicht genau (aber vielleicht andere!). Aber noch mal:
Wie bereits erwähnt rut paint() nur all die anderen Zeichenmethoden auf, zuerst paintComponent, dann paintBorder (klar, zeichnet den Rand) und danach paintChildren, was alle """geaddeten""" Komponenten zeichnen lässt.

Im Falle eines deckhaften JPanel wird in paintComponent nicht viel mehr gemacht als den Hintergrund mit der Hintergrundfarbe zu füllen, wenn ich mich nicht täusche. Folglich eignet sich sich das überschreiben der paintComponet sehr wohl für deinen Fall. Denn wenn du die Kompente nicht deckhaft machst, mit setOpaque(false), wird im Falle des JPanels eh {[(evtl. so gut wie)]} gar nichts in der super.paintComponent gezeichnet.

EDIT:
Das war genau der Gedanke, der für mich Falsch war. Denn ich will ja den Hintergrund zeichnen und danach alles andere darüber. Wenn ich erst alles zeichnen lasse und dann den Hintergrund male, gibt es ja keinen Vordergrund mehr.

Um noch mal speziell darauf einzugehen: alles andere darüber bedeutet in etwa bei einem deckhaften JPanel
Code:
g.setColor(getBackground()); g.fillRect(0, 0, getWidth(), getHeight());
. Somit würdest du nichts vom einem selbst - vorher - gezeichneten Bild sehen. Und Foreground hat bei einem JPanel nun mal nichts.
 
Zuletzt bearbeitet:

Lequ

Mitglied
Was ich nun gelernt habe:
- ein JFrame hat kein paintComponent, deshalb benötigt man ein weiteren JPanel im Hintergrund dessen paintComponent man überschreiben kann
- wenn man man paint oder ähnliches überschreibt, sollte der entsprechende super aufruf am Anfang stehen und danach die Eigenzeichnung angefügt werden. Selbst wenn es transparent is, wird das davor gezeichnete übermalt.

Der vollständigkeit halber, hier die funktionierende Lösung.
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RadialGradientPaint;
import java.awt.geom.Point2D;

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

@SuppressWarnings("serial")
public class GuiTest extends JFrame {

	public GuiTest() {
		setSize(400, 300);
		setVisible(true);
		
		JPanel backgroundPanel = new JPanel(){
			public void paintComponent(Graphics g) {
				super.paintComponent(g);
				Point2D center = new Point2D.Float(getWidth() / 2, getHeight() / 3);
				float radius = Math.max(getWidth(), getHeight()) / 2;
				float[] dist = { 0.0f, 1.0f };
				Color[] colors = { Color.white, Color.blue };
				RadialGradientPaint gradientPaint = new RadialGradientPaint(center,
						radius, dist, colors);

				Graphics2D g2d = (Graphics2D) g;
				g2d.setPaint(gradientPaint);
				g2d.fillRect(0, 0, getWidth(), getHeight());

				
			}
		};
		
		JPanel middlePanel = new JPanel();
		middlePanel.setOpaque(false);
		middlePanel.add(new JButton("I am legend"));
		backgroundPanel.add(middlePanel);
		add(backgroundPanel);
	}



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

Danke an alle!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JavaFX Line Chart mit Farbverlauf/Gradient in Linie AWT, Swing, JavaFX & SWT 1
C JButton Gradient? AWT, Swing, JavaFX & SWT 4
W Realisierung Gradient in der Titlebar JInternalFrame AWT, Swing, JavaFX & SWT 7
frager2345 Bild aus Dateien lesen und als Hintergrund verwenden AWT, Swing, JavaFX & SWT 2
1 2D-Grafik Flackerndes Hintergrund AWT, Swing, JavaFX & SWT 1
ralfb1105 JavaFX HTTP Download task im Hintergrund innerhalb GUI AWT, Swing, JavaFX & SWT 70
Drachenbauer Swing Wie ändere ich den Hintergrund vom Anzeigefeld einer JComboBox, die nicht zum Hineinschreiben offen steht? AWT, Swing, JavaFX & SWT 32
A Fehler beim Hintergrund AWT, Swing, JavaFX & SWT 17
C Java Hintergrund funktioniert nicht AWT, Swing, JavaFX & SWT 9
A Bilder als Hintergrund AWT, Swing, JavaFX & SWT 2
BobbGott durchsichtiges JTextField mit Hintergrund AWT, Swing, JavaFX & SWT 12
L JPanel zeichnet im Konstrukter erzeugten Hintergrund nicht AWT, Swing, JavaFX & SWT 10
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
T Hintergrund für GUI AWT, Swing, JavaFX & SWT 1
I 2D-Grafik Bilder Eingefügt, button jetzt im Hintergrund AWT, Swing, JavaFX & SWT 2
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
D JButton - Nur Icon anzeigen / transparenter Hintergrund AWT, Swing, JavaFX & SWT 2
H Textfield bleibt im Hintergrund AWT, Swing, JavaFX & SWT 2
E JTable Hintergrund von geklickter Zelle ändern AWT, Swing, JavaFX & SWT 2
wolfgang63 JavaFX Transparenter Hintergrund aber sichtbare Buttons AWT, Swing, JavaFX & SWT 6
F 2D-Grafik Den Hintergrund loopen AWT, Swing, JavaFX & SWT 3
V LookAndFeel JSpinner Hintergrund Farbe mit Nimbus LaF AWT, Swing, JavaFX & SWT 0
O 2D-Grafik Bild abgeschnitten nach Rotation mit Affine Transform und Hintergrund Schwarz AWT, Swing, JavaFX & SWT 8
O Hintergrund von AffineTransfom (rotation) ändern AWT, Swing, JavaFX & SWT 0
D paintComponent() mit transparentem Hintergrund. AWT, Swing, JavaFX & SWT 0
C JFrame paint ohne hintergrund nutzen AWT, Swing, JavaFX & SWT 6
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
S Swing, Button benutzen zum Hintergrund wechseln AWT, Swing, JavaFX & SWT 3
N Swing microba - DatePicker: Feld-Hintergrund anpassen AWT, Swing, JavaFX & SWT 2
M Tastatureingabe im Hintergrund (JTable) AWT, Swing, JavaFX & SWT 2
B Hintergrund laden AWT, Swing, JavaFX & SWT 3
B Swing Zähler im Hintergrund falsch berechnet - Warum? AWT, Swing, JavaFX & SWT 3
J JButton Hintergrund AWT, Swing, JavaFX & SWT 5
K Swing JTable Text im Hintergrund einer leeren Tabelle AWT, Swing, JavaFX & SWT 3
L Beim Neuzeichnen einer Swing GUI kurz Schwarzer Hintergrund AWT, Swing, JavaFX & SWT 8
D Swing Probleme bei transparenten Hintergrund im JTextField AWT, Swing, JavaFX & SWT 6
J Swing Malen auf JPanel mit transparentem Hintergrund AWT, Swing, JavaFX & SWT 21
S 2D-Grafik Bild bleibt im Hintergrund bei Diashow AWT, Swing, JavaFX & SWT 3
D Applet hintergrund wird nicht weiß AWT, Swing, JavaFX & SWT 2
B JList transparenter Hintergrund AWT, Swing, JavaFX & SWT 2
J Speichern, Event, Hintergrund getAppletContext AWT, Swing, JavaFX & SWT 2
E Swing JPanel mit Hintergrund AWT, Swing, JavaFX & SWT 3
L Bilder im JPanel als Hintergrund - Swing AWT, Swing, JavaFX & SWT 2
kniffel GUI-Applet JTable füllt Hintergrund völlig aus AWT, Swing, JavaFX & SWT 4
J Hintergrund Label-Frame AWT, Swing, JavaFX & SWT 3
A Hintergrund von einem Frame ändern AWT, Swing, JavaFX & SWT 3
T Hintergrund AWT, Swing, JavaFX & SWT 4
T Hintergrund für 3D Erde AWT, Swing, JavaFX & SWT 4
G 2D-Grafik BufferedImage Hintergrund immer schwarz AWT, Swing, JavaFX & SWT 4
P Swing Zeichnung auf Tab im Hintergrund wird nicht gezeichnet AWT, Swing, JavaFX & SWT 3
J Label mit transparentem hintergrund - geht das? AWT, Swing, JavaFX & SWT 21
B AWT Bild als Hintergrund im Applet AWT, Swing, JavaFX & SWT 2
R Bedeckter Hintergrund AWT, Swing, JavaFX & SWT 17
D Komponenten um weitere Hintergrund- bzw. Vordergrundfarbe erweitern AWT, Swing, JavaFX & SWT 11
M JFrame (Mausrad, Hintergrund) AWT, Swing, JavaFX & SWT 13
Dragonfire Swing Hintergrund aller Komponenten verändern AWT, Swing, JavaFX & SWT 2
DStrohma Swing JPanel mit Bild als Hintergrund AWT, Swing, JavaFX & SWT 2
B Swing Image als Hintergrund im JInternalFrame - Problem AWT, Swing, JavaFX & SWT 3
N GridBagLayout, leere grids (Hintergrund) transparent? AWT, Swing, JavaFX & SWT 3
J Swing JPanel mit Hintergrund zeigt componente nicht AWT, Swing, JavaFX & SWT 6
E einfache Frage:warum ist Hintergrund grau ? AWT, Swing, JavaFX & SWT 24
algorismi JCompnent mit transparentem Hintergrund AWT, Swing, JavaFX & SWT 4
T Schließen eines JDialogs setzen den JFrame in den Hintergrund AWT, Swing, JavaFX & SWT 2
J CellRenderer einzelne zellen Hintergrund AWT, Swing, JavaFX & SWT 9
R JTable Hintergrund der Zeile abhängig von Inhalt einer Zelle verändern AWT, Swing, JavaFX & SWT 3
E Progress Bar mit Bild als Hintergrund AWT, Swing, JavaFX & SWT 2
N Swing Hintergrund Bild in JAR Datei AWT, Swing, JavaFX & SWT 2
N im fenster ein hintergrund bild einfügen AWT, Swing, JavaFX & SWT 18
A Swing Mit Graphics2D auf transparentem Hintergrund zeichnen AWT, Swing, JavaFX & SWT 7
A Hintergrund erstellen AWT, Swing, JavaFX & SWT 13
J Layer von JLayeredPane unsichtbar durchsichtig in den Hintergrund AWT, Swing, JavaFX & SWT 5
T GridLayout Zeilen Hintergrund AWT, Swing, JavaFX & SWT 5
P Swing JComboBox beschädigt hintergrund AWT, Swing, JavaFX & SWT 4
S JButton - Hintergrund verändern AWT, Swing, JavaFX & SWT 7
J Fensterrand überdeckt Hintergrund AWT, Swing, JavaFX & SWT 9
K JTable hintergrund AWT, Swing, JavaFX & SWT 12
SebSnake Animiertes GIF auf JPG Hintergrund darstellen? AWT, Swing, JavaFX & SWT 3
G Label auf Panel auf Panel mit Grafiken als Hintergrund (awt) AWT, Swing, JavaFX & SWT 7
G TextField im Hintergrund AWT, Swing, JavaFX & SWT 2
O Zweifarbiger Hintergrund in einer TableCell? AWT, Swing, JavaFX & SWT 4
R Bilder als Hintergrund für Swing - Komponenten AWT, Swing, JavaFX & SWT 3
R HTML Hintergrund für Swing - Componenten AWT, Swing, JavaFX & SWT 2
0 JTable - Hintergrund Tabellen statt Grau AWT, Swing, JavaFX & SWT 5
V JButton in Hintergrund zwingen? AWT, Swing, JavaFX & SWT 14
G Hintergrund AWT, Swing, JavaFX & SWT 5
M Hintergrund Transparent machen? AWT, Swing, JavaFX & SWT 3
F Farbe für den Hintergrund eine BorderLayout-Teils AWT, Swing, JavaFX & SWT 5
C Fenster rücken beim Drucken in den Hintergrund AWT, Swing, JavaFX & SWT 6
B Programm im Hintergrund - JFrame AWT, Swing, JavaFX & SWT 5
D Robot: Screenshot vom Desktop Hintergrund möglich ? AWT, Swing, JavaFX & SWT 3
F JDialog im Hintergrund lassen AWT, Swing, JavaFX & SWT 2
G schwarzen hintergrund von png transparent machen AWT, Swing, JavaFX & SWT 2
J jlabels überlappen / vorder-hintergrund AWT, Swing, JavaFX & SWT 2
G hintergrund farbe vom flow layout ändern AWT, Swing, JavaFX & SWT 2
S Button im Hintergrund AWT, Swing, JavaFX & SWT 12
foobar JTable im Hintergrund drucken AWT, Swing, JavaFX & SWT 2
B Hintergrund eines JPanels AWT, Swing, JavaFX & SWT 16
M Bild als Hintergrund anzeigen? AWT, Swing, JavaFX & SWT 12
S Hintergrund JTable AWT, Swing, JavaFX & SWT 9
G hintergrund von JFrame/Container transparent machen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben