paintComponent überdeckt ...

Status
Nicht offen für weitere Antworten.

AEQUITAS

Mitglied
Hallo zusammen,

ich gebe die google-Suche und hier die Forensuche auf.

Ich suche seit mehreren Tagen nach einer Lösung. Und zwar geht es um die paintComponent Methode bei JComponents, speziell bei mir bei JMenuBar.

Und zwar will ich zum Test erstmal ein GradientPaint als Background einfügen, statt der Standardfarben. Wenn ich die paintComponent-Methode jedoch entsprechend überschreibe, wird das JMenu, was geadded wird nicht mehr anzeigt, nur wenn man mit der Maus drüber fährt, sprich es ist verdeckt.

Das gleiche passiert, wenn ich die paintComponent-Methode bei einem JTextField überschreibe. Hier wollte ich auch einen GradientPaint in den Background zeichnen, jedoch wird dann der Input und der Maustextcursor dadrin nicht mehr angezeigt.

Anbei der Code.

Ich hoffe, Ihr könnt mir weiterhelfen, danke schon mal!

Auszug aus der View:
Code:
JMenuBar topMenuBar = new GradientTopBar();
	    
	    // Create menuButton - File
	    JMenu menuFile = new JMenu("Datei");
	    menuFile.setBackground(Color.white);
	    
	    // Create menuItem
	    JMenuItem itemSettings = new vMenuItem("Einstellungen", "graphics/iconsTopMenu/menuSettings.png");
	    JMenuItem itemExit = new vMenuItem("Beenden", "graphics/iconsTopMenu/menuExit.png");
	    
	    menuFile.add(itemSettings);
	    menuFile.add(itemExit);
	    topMenuBar.add(menuFile);

Die Komponentenklasse:
Code:
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JMenuBar;

public class GradientTopBar extends JMenuBar {
	
	private Color startColor;
	private Color endColor;

	public GradientTopBar() {
		super();
		startColor = Color.white;
		endColor = Colors.Gray.color();
	}
	
	public GradientTopBar(Color startColor, Color endColor) {
		super();
		this.startColor = startColor;
		this.endColor = endColor;
	}

	public void setStartColor(Color startColor) {
		this.startColor = startColor;
	}

	public void setEndColor(Color endColor) {
		this.endColor = endColor;
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		GradientPaint gradientPaint = new GradientPaint( 0 , 0 , startColor , 0, super.getHeight(), endColor );
				
		Graphics2D g2d = (Graphics2D) g;
		g2d.setPaint(gradientPaint);
		g2d.setColor(Color.red);
		g2d.drawRect(0, 0, super.getWidth(), super.getHeight());
		g.dispose();
	}
}
 

KrokoDiehl

Top Contributor
Hi.
Ich hab deinen Code nicht getestet, aber was mir direkt auffiel:
Java:
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		GradientPaint gradientPaint = new GradientPaint( 0 , 0 , startColor , 0, super.getHeight(), endColor );
				
		Graphics2D g2d = (Graphics2D) g.create(); // ÄNDERUNG
		g2d.setPaint(gradientPaint);
		g2d.setColor(Color.red);
		g2d.drawRect(0, 0, super.getWidth(), super.getHeight());
		g.dispose();
	}
Vielleicht lags ja nur daran ;) Ansonsten sehe ich keine Absonderheit.
 

AEQUITAS

Mitglied
Das gibt es doch gar nicht ... daran lag es tatsächlich :lol: DANKE!!!!!!

Falls mir jetzt noch jemand sagen kann, wie man die Höhe der Leiste verändert bin ich restlos glücklich. ;-)

// Edit

Habe es mal schnell beim JTextField geändert, jedoch wird da der Zeiger und der Input immer noch nicht angezeigt. Bitte um Hilfe.

Hier der Codeauszug:

Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JTextField;
import javax.swing.border.LineBorder;

public class DialogTextField extends JTextField {

	public DialogTextField() {
		super();
		super.setPreferredSize(new Dimension(340,20));
		super.setFont(new Font("sansserif", Font.PLAIN, 13));
		super.setForeground(new Color(80, 80, 80));
		super.setBackground(Color.white);
		super.setBorder(new LineBorder(Color.white));
		super.setOpaque(true);
		super.setEditable(true);
	}
	
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
	    int panelHeight = super.getHeight();
		int panelWidth = super.getWidth();
		GradientPaint gradientPaint = new GradientPaint( 0 , 0 , Color.white, 0 , panelHeight , Color.LIGHT_GRAY);
		Graphics2D graphics2D = (Graphics2D) g.create();
		graphics2D.setPaint(gradientPaint);
		graphics2D.fillRect(0 , 0, panelWidth, panelHeight);
		graphics2D.dispose();
	}
	
}
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Wundert mich, dass es beim Menü funktioniert. Hätte schon erwartet, dass, wenn man etwas mit einem bunten Rechteck übermalt, man eben genau dieses Rechteck sieht und nicht dass was dahinter steckt.
Ich würde statt dessen ein JPanel nehmen, den Farbverlauf auf des Panel zeichnen und dann ein durchsichtiges JTextField auf dieses Panel setzen.
 

KrokoDiehl

Top Contributor
Zum Thema Größe:
Code:
setPreferredSize()
hilft sehr oft. Bei wirklich eigenen Dingen kann man auch
Code:
getPreferredSize()
überschreiben.

Bei den anderen weiß ich nicht, was du mit "Zeiger" und "Input" meinst...
 

AEQUITAS

Mitglied
Zum Thema Größe:
Code:
setPreferredSize()
hilft sehr oft. Bei wirklich eigenen Dingen kann man auch
Code:
getPreferredSize()
überschreiben.

Bei den anderen weiß ich nicht, was du mit "Zeiger" und "Input" meinst...
Mit Zeiger meine ich die Linie die aufblingt, wenn du dich in einem Textfeld oder hier im Formular befindest und mit Input der Text der im Textfield steht. Der wird einfach überdeckt. Das mit den JPanels wäre eventuell eine Möglichkeit, ich finds aber irgendwie unschön.

Also wenn ich ein JTextField neu Zeichne, dann "male" ich automatisch über den Text?
 

Michael...

Top Contributor
Also wenn ich ein JTextField neu Zeichne, dann "male" ich automatisch über den Text?
Wenn Du super.paintComponent(g) aufrufst wird zeichnet zunächst mal die Superklasse, im Falle eines Textfelds vermutlich erst den Hintergrund, dann den Text, ... wie das mit dem blinkenden Cursor geregelt ist - keine Ahnung. Und wenn Du jetzt auf dem Graphikobjekt weiter zeichnest wird das was bisher gezeichnet wurde übermalt. Das was zuletzt gezeichnet wird ist im "Vordergrund" (sonst würde das ganze ja keinen Sinn machen) - Du aber willst ja nur den Hintergrund ändern.
 

KrokoDiehl

Top Contributor
Hm.. hat JTextField ein
Code:
 paintChildren()
? Falls ja, kannst du das NACH deinem Zeichen aufrufen. Ich erinnere mich dunkel daran, dass das bei mir mal geholfen hat.

Aber Michael... hat da schon recht, du musst was an der Reihenfolge tun.

Der "Zeiger" heißt übrigens Cursor oder Caret (in Swing) *klugscheiss* ;)
 

André Uhres

Top Contributor
Hm.. hat JTextField ein
Code:
 paintChildren()
? Falls ja, kannst du das NACH deinem Zeichen aufrufen. Ich erinnere mich dunkel daran, dass das bei mir mal geholfen hat.
Aber Michael... hat da schon recht, du musst was an der Reihenfolge tun.
Der "Zeiger" heißt übrigens Cursor oder Caret (in Swing) *klugscheiss* ;)
Es ist sinnlos, paintChildren innerhalb von paintComponent aufzurufen. Vom System wird immer paint() aufgerufen, wenn es Zeit ist darzustellen. Swing ruft dann innerhalb von paint() folgende Methoden auf, und zwar in der angegebenen Reihenfolge:
Code:
    protected void paintComponent(Graphics g)
    protected void paintBorder(Graphics g)
    protected void paintChildren(Graphics g)
Wie man sieht, wird paintChildren sowieso immer erst nach paintComponent aufgerufen!

Beim JTextField können wir allerdings nicht paintComponent überschreiben, sondern wir müssen mit setUI() einen eigenen Look and Feel Delegate setzen, etwa so:
Java:
setUI(new BasicTextFieldUI() {
    @Override
    protected void paintBackground(Graphics g) {
        super.paintBackground(g);
        int panelHeight = DialogTextField.super.getHeight();
        int panelWidth = DialogTextField.super.getWidth();
        GradientPaint gradientPaint = new GradientPaint(0, 0, Color.white, 0, panelHeight, Color.LIGHT_GRAY);
        Graphics2D graphics2D = (Graphics2D) g;
        graphics2D.setPaint(gradientPaint);
        graphics2D.fillRect(0, 0, panelWidth, panelHeight);
    }
});

Der ursprüngliche Fehler hängt übrigens mit [c]g.dispose();[/c] zusammen. Wenn wir nur casten [c]Graphics2D g2d = (Graphics2D) g;[/c], dann müssen wir [c]g.dispose();[/c] einfach weglassen. Falls wir mit [c]Graphics2D g2d = (Graphics2D) g.create();[/c] ein neues Graphics Objekt anlegen, dann müssen dieses neue Objekt mit [c]g2d.dispose();[/c] freigeben, wenn wir es nicht mehr brauchen (um Speicherplatz zu sparen).

Wundert mich, dass es beim Menü funktioniert. Hätte schon erwartet, dass, wenn man etwas mit einem bunten Rechteck übermalt, man eben genau dieses Rechteck sieht und nicht das was dahinter steckt.
"das was dahinter steckt" sind in diesem Fall die Kindkomponenten. Sie werden in paintChildren() gemalt. Wegen der oben gezeigten Reihenfolge der drei paintXXX() Methoden, stehen die Kindkomponenten immer im Vordergrund! Beim JTextField können wir es aber nicht auf die gleiche Art machen, weil keine Kindkomponenten da sind.
Siehe auch Malen in AWT und Swing - Byte-Welt Wiki
 
Zuletzt bearbeitet:

AEQUITAS

Mitglied
Wow, vielen Dank für die sehr gute Erklärung!!!

Eine Frage habe ich nun aber noch. Ist es sinnvoller beim Gestalten einer GUI eher die UI (also das Look&Feel) der einzelnen Komponenten zu ändern oder die einzelnen Komponenten zu Erben und eigene Klassen zu machen, wie ich das jetzt bei der JMenuBar gemacht habe?

Wenn ich sowas nun mache, dann möchte ich das natürlich möglichst "richtig" machen, wenn es in dem Fall überhaupt ein richtig oder falsch gibt.
 
Zuletzt bearbeitet:

AEQUITAS

Mitglied
Soweit klappt alles mit der eigenen UI für die JMenuBar. Nun habe ich auch entsprechend eine für JMenu gemacht, jedoch ist nun kein Mousehighlighter mehr vorhanden. Sprich wenn ich mit der Maus über "Datei" (mein JMenu) fahre, dann ändert sich nicht der Hintergrund (bzw. die Hintergrundfarbe).

Scheint so, als hätte ich den mit paintBackground überschrieben. Wie kann ich nun dieses "Highlight", "Select" oder wie man es auch immer nennt überschreiben?

Gibt es vielleicht ein gutes Tutorial (Deutsch/Englisch egal), was sich mit der Erstellung von UIs beschäftigt? Habe bisher nur ein sehr gutes über TabbedPanes gefunden:
blog.elevenworks.com Blog Archive Creating a custom UI delegate for JTabbedPane

Hier mal der Code:
Code:
package gui;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JMenuItem;
import javax.swing.plaf.basic.BasicMenuUI;

public class UITopMenu extends BasicMenuUI {
	
	@Override
    protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) {
		
		super.paintBackground(g, menuItem, bgColor);
        int panelHeight = 25;
        int panelWidth = menuItem.getWidth();
        GradientPaint gradientPaint = new GradientPaint(0, 0, Color.white, 0, panelHeight, new Color(220,220,220));

		Graphics2D g2d = (Graphics2D) g.create();
		g2d.setPaint(gradientPaint);
		g2d.fillRect(0, 0, panelWidth, panelHeight);
		g2d.dispose();
    }
	
}
 

André Uhres

Top Contributor
In diesem Fall ist das ja ziemlich einfach: wir fragen das Model, ob selektiert wurde. Wenn ja, dann malen wir mit einer anderen Farbe:
Java:
if (menuItem.getModel().isSelected()) {
    g.setColor(bgColor);
...
Ich persönlich halte aber nicht viel von solchen spielerischen Eingriffen ins Aussehen von Standardkomponenten, ohne triftigen funktionellen Grund. Darum kann ich diesbezüglich auch nichts generell empfehlen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
H new Operator in paintComponent - Speicherprobleme vorprogrammiert? AWT, Swing, JavaFX & SWT 2
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
G update, paintComponent AWT, Swing, JavaFX & SWT 1
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
C Objekt an paintComponent weitergeben AWT, Swing, JavaFX & SWT 1
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
D PaintComponent wird nicht aufgerufen AWT, Swing, JavaFX & SWT 3
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I (JPanel) paintComponent mit Zeitverschiebung (Sleep/Wait) AWT, Swing, JavaFX & SWT 1
K Swing paintComponent, JPanel auslagern, ChangeEvents AWT, Swing, JavaFX & SWT 7
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
B AWT paintComponent wird nur 2 mal ausgeführt?! AWT, Swing, JavaFX & SWT 5
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
D paintComponent() mit transparentem Hintergrund. AWT, Swing, JavaFX & SWT 0
G Swing Flackern nach Override von paintComponent() AWT, Swing, JavaFX & SWT 3
M Swing paintComponent in rekusivem JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 2
M DefaultTableModel ruft paintComponent auf ! AWT, Swing, JavaFX & SWT 4
T Swing paintComponent(); AWT, Swing, JavaFX & SWT 24
K Swing JButton paintComponent überschreiben AWT, Swing, JavaFX & SWT 5
Kenan89 2D-Grafik paintComponent quetsch alles in Panel AWT, Swing, JavaFX & SWT 26
B 2D-Grafik paintComponent für rechteckigen Bereich? AWT, Swing, JavaFX & SWT 6
P Swing problem mit paintComponent AWT, Swing, JavaFX & SWT 2
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
K paintComponent nicht aufgerufen AWT, Swing, JavaFX & SWT 2
J Mal wieder Probleme mit paintComponent AWT, Swing, JavaFX & SWT 3
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
S auf paintComponent() warten AWT, Swing, JavaFX & SWT 34
W JPanel Überschreiben // paintComponent? AWT, Swing, JavaFX & SWT 4
propra Wieso wird paintComponent() beim Start 2 malausgeführt? AWT, Swing, JavaFX & SWT 4
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
P JLabel paintComponent AWT, Swing, JavaFX & SWT 3
Z Swing paintcomponent und menbar Problem AWT, Swing, JavaFX & SWT 3
S Image wird nicht (immer) in paintComponent gezeichnet? AWT, Swing, JavaFX & SWT 6
R 2D-Grafik auf JPanel zeichen - ohne @Override paintComponent AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent & BorderFactory AWT, Swing, JavaFX & SWT 2
A paintComponent AWT, Swing, JavaFX & SWT 4
T Rechtecke zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 3
R paintComponent direkt bei actionPerformed aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
K JPanel und paintComponent AWT, Swing, JavaFX & SWT 8
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5
C Checkbox in Liste deaktivieren und paintComponent explizit aufrufen AWT, Swing, JavaFX & SWT 12
C Performance-Problem beim Überschreiben von paintComponent() AWT, Swing, JavaFX & SWT 2
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Game of Life - PaintComponent-Problem / Timer? AWT, Swing, JavaFX & SWT 8
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
J paintComponent() übergeben AWT, Swing, JavaFX & SWT 4
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
kodela Swing paintComponent() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 19
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
E WARUM wird paintComponent nicht aufgerufen? AWT, Swing, JavaFX & SWT 12
C paintComponent mit Maus verschieben - wie? AWT, Swing, JavaFX & SWT 2
G Swing paintComponent Effizienz? AWT, Swing, JavaFX & SWT 4
R paintComponent Kollision AWT, Swing, JavaFX & SWT 2
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent() AWT, Swing, JavaFX & SWT 2
T Swing paintComponent problem AWT, Swing, JavaFX & SWT 3
MrGe getWidth(); getHeight(); außerhalb von paintComponent AWT, Swing, JavaFX & SWT 4
JFeel-x repaint für Aufruf von paintComponent-Klasse ungeeignet? AWT, Swing, JavaFX & SWT 11
F Wer ruft paintComponent() Methode auf? AWT, Swing, JavaFX & SWT 9
@ JPanel: kein paintComponent() trotz repaint() AWT, Swing, JavaFX & SWT 4
G paintComponent Problem AWT, Swing, JavaFX & SWT 6
T paintComponent() überschreiben: Platz für Border freihalten? AWT, Swing, JavaFX & SWT 6
G paintComponent JPanel im JApplet AWT, Swing, JavaFX & SWT 2
X Speichern in der paintComponent() Methode AWT, Swing, JavaFX & SWT 15
W JLabel + paintComponent AWT, Swing, JavaFX & SWT 2
V Wieviel Logik in paintComponent? AWT, Swing, JavaFX & SWT 7
hdi super.paintComponent(g); soll nicht alles löschen AWT, Swing, JavaFX & SWT 2
G paintComponent() Methode für JPanel in NetBeans überschreibe AWT, Swing, JavaFX & SWT 2
L Problem mit paintComponent() under java < 1.6 under Windo AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
N Probleme mit paintComponent und GradientPaint AWT, Swing, JavaFX & SWT 5
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
D performance problem: paintcomponent, alphacomp, bufferedImag AWT, Swing, JavaFX & SWT 10
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
C Bei Skalierung wird paintComponent() nicht aufgerufen,warum? AWT, Swing, JavaFX & SWT 4
K Problem repaint()->paintComponent AWT, Swing, JavaFX & SWT 9
G paintComponent wird nicht dargestellt AWT, Swing, JavaFX & SWT 5
T Kuchendiagramm - mit paintComponent nach JButton druck zeich AWT, Swing, JavaFX & SWT 4
R paintComponent wird anscheinend nicht aufgerufen AWT, Swing, JavaFX & SWT 2
T JPanel mit paintComponent methode im JInternalFrame AWT, Swing, JavaFX & SWT 3
M super.paintComponent(g); aufrufen oder nicht? AWT, Swing, JavaFX & SWT 8
M Unterschied zwischen paintComponent() und paint()? AWT, Swing, JavaFX & SWT 4
D JTextArea in der paintComponent () hinzufügen? AWT, Swing, JavaFX & SWT 9
raptorrs J2D paintComponent: Nur ganzzahlige (-int) Werte möglich? AWT, Swing, JavaFX & SWT 3
B Schon wieder ein Problem mit paintComponent(). AWT, Swing, JavaFX & SWT 2
G Keine Anzeige von Grafik bei externem paintComponent-Aufruf AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben