Komponenten verschwinden von JPanel, wenn ich den HG selbst male - Hilfeeee

Status
Nicht offen für weitere Antworten.

data89

Bekanntes Mitglied
Hallo Leute,

ich habe eine einfache Klasse, die von JPanel abgeleitet ist. In dieser Klasse überschreibe ich die Methode "public void paint(Graphics g)" vom JPanel. Alles klappt wunderbar, bis man etwas mit dem Fenster macht. Sobald ich das Fenster verschiebe/verkleinere/vergrößere wird nur noch das JPanel gezeichnet und nicht mehr die Komponenten auf dem JPanel. Was mache ich da falsch? Wie kann ich dafür sorgen, dass dies nicht passiert?

Java:
public void paint(Graphics g) {
        super.paint(g);

        Graphics2D g2d = (Graphics2D)g;
        // male was ...
}
 

data89

Bekanntes Mitglied
Vielen Dank, hab es gerade herausgefunden durch learning by doing!

Aber noch eine Frage: das mit dem selbstzeichen klappt ja jetzt wunderbar. Aber, wenn ich ein PopUp-Menü (durch Rechtsklick) öffne und eine Option auswähle, dann schließt sich das PopUp-Menü und zurück bleibt ein grauer Kasten im Bild. Da das ganz und garnicht schön ist, frage ich Euch, ob Ihr wisst, wie man diesen Kasten entfernt?

Mein erster Ansatzpunkt war, immer einen repaint() des Fensters aufzurufen, wenn eine Option im PopUp-Menü gewählt wurde, aber das ist ja wohl nicht der Sinn des ganzen ... da gibt's doch sicher noch eine elegantere Variante, oder?

Danke,
data89

P.S.: Und noch ein Problem hab ich: bei den Rundungen von den Buttons (z.B. XP-LaF) wird immer ein weißer Rand gezeichnet. Aber ich denke, dass ich das mit Hilfe dieser Seite in den Griff bekomme: Java tip: Use gradient backgrounds to add interest and polish to a user interface | Nadeau Software
 

Nicer

Bekanntes Mitglied
Der Repaint wäre sicherlich eine lösung , unschön aber würde glaubich gehn , ansonsten einfach popupmenu in dem zeichenfeld sperren und nur ausserhalb des feldes zugänglich machen.
 

data89

Bekanntes Mitglied
Der Repaint wäre sicherlich eine lösung , unschön aber würde glaubich gehn , ansonsten einfach popupmenu in dem zeichenfeld sperren und nur ausserhalb des feldes zugänglich machen.
"zeichenfeld sperren" - was bedeutet das? Etwa, dass ich die Methode "protected" nenne?

wie setzt und öffnest du dein Popupmenu??
Hier nochmals zum anschauen:
bspb5bccc7fpng.png

Das oberste - da ist alles okay. Darunter sieht man die Fehler in den rot eingekreisten Bereichen und teile davon verschwinden auch nicht mit einem repaint() ...

Die von JPanel abgeleitete Klasse hat folgende Methoden:
Java:
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    // paint s.th. here 
}

Erzeugung des Pop-Up-Menüs:
Java:
		JButton btn = new JButton("Btn");
		
                final JButton btnObj = btn;
                final JPopupMenu pop = new JPopUpMenu();
		btn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				pop.show(btnObj , 0, btnObj.getPreferredSize().height);
			}
		});
		
                // add s.th. to the pop up menu
                pop.add(new JMenuItem("Item 1"));

Danke vorab!
 
Zuletzt bearbeitet:
G

Gast2

Gast
Mach mal ein KSKB...

Und was soll den das hier?
Java:
JButton btn = new JButton("Btn");
        
                final JButton btnObj = btn;
 

data89

Bekanntes Mitglied
Ich muss ja in "actionPerformed" den Button zur Verfügung haben. Und da die ActionListener-Klasse "eingebaut" ist, kann man so am einfachsten darauf zugreifen ...
 
G

Gast2

Gast
Es gibt auch
Code:
e.getSource();

wie gesagt zu deinem anderen Problem mach mach ein KSKB
 

data89

Bekanntes Mitglied
Wenn man in Zeile 16 die "0" durch z.B. "100" ersetzt, dann ist der Effekt noch größer.
test5316009apng.png

Hier ein Beispiel, das beim Klick auf den Button den Effekt zeigt (oberer Teil im Bild):
Java:
public class GUI extends JFrame {

	private JPopupMenu pop;

	public GUI() {
		this.setLayout(new BorderLayout());
		
		JPanel p = new TestPanel();
		
		JButton btn = new JButton("Action");
		
       	this.pop = new JPopupMenu();
		btn.addActionListener(new ActionListener() {
		    public void actionPerformed(ActionEvent a) {
		    	JButton btn = (JButton) a.getSource();
		        pop.show(btn, 0, btn.getPreferredSize().height);
		    }
		});

        // add s.th. to the pop up menu
		pop.add(new JMenuItem("Item 1"));
		pop.add(new JMenuItem("Item 2"));
		pop.add(new JMenuItem("Item 3"));
		pop.add(new JMenuItem("Item 4"));
		
		p.add(btn);
		this.add(p, BorderLayout.PAGE_START);
		
		this.pack();
		this.setSize(new Dimension(900, 600));
	}
	
	class TestPanel extends JPanel {
		
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			
			int width = g.getClipBounds().width;
			int height = g.getClipBounds().height;
	        Graphics2D g2d = (Graphics2D)g;
	        g2d.fillRect(0, 0, width, height);
		}
		
	}
	
	public static void main(String[] args) {
		new GUI().setVisible(true);
	}
	
}
 
Zuletzt bearbeitet:
G

Gast2

Gast
Java:
        pop.addPopupMenuListener(new PopupMenuListener() {
			
			@Override
			public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
				System.out.println("popupMenuWillBecomeVisible");
				
			}
			
			@Override
			public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
				p.repaint();
				
			}
			
			@Override
			public void popupMenuCanceled(PopupMenuEvent e) {
				System.out.println("popupMenuCanceled");
				
			}
		});
 

data89

Bekanntes Mitglied
Es funktioniert, wenn man in "popupMenuWillBecomeVisible" und "popupMenuCanceled" ein repaint setzt!!

Noch eine Frage (ist die letzte!): Wenn ich einen gerundeten Button auf das Panel setze wird ein Rand gezeichnet, der sich nicht durch "setOpaque" beeinflussen lässt - muss ich da auch sowas anwedenen, wie für das Pop-Up-Menü.

EDIT: Das tut's nicht so, wie das letzte Problem zu lösen ...
 
Zuletzt bearbeitet:
G

Gast2

Gast
Warum willst du ein PopUp eigentlich mit einem Button öffnen??
 
G

Gast2

Gast
Und was hast das jetzt mit dem Button zu tun???
du kannst das Menü nämlich auch mit setComponentPopMenu oder so auf die JComponente adden dann geht es so auf die es bei dem jeweiligen OS ist...
 

André Uhres

Top Contributor
Die Lösung mit dem Listener ist schlicht Unfug. Der Fehler liegt bei der Verwendung der ClipBounds. Versuch's mal so:
Java:
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Rectangle r = g.getClipBounds();
    g.fillRect(r.x, r.y, r.width, r.height);
}
Beispiel für einen runden Button:
Java:
...
        JButton btn = new OvalButton("Action");
        this.pop = new JPopupMenu();
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent a) {
                JButton btn = (JButton) a.getSource();
                pop.show(btn, 0, btn.getHeight());
            }
        });
...
class OvalButton extends JButton {
    public OvalButton(String text) {
        super(text);
        setContentAreaFilled(false);
        setBorderPainted(false);
        setFocusPainted(false);
        setIcon(new OvalIcon());
        setRolloverIcon(new RolloverIcon());
        setPressedIcon(new PressedIcon());
        setHorizontalTextPosition(SwingConstants.CENTER);
        setVerticalTextPosition(SwingConstants.CENTER);
    }
    class OvalIcon implements Icon {
        public void paintIcon(Component c, Graphics g, int x, int y) {
            ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.setColor(getBackground());
            g.fillOval(0, 0, getIconWidth(), getIconHeight());
        }
        public int getIconWidth() {
            return getWidth();
        }
        public int getIconHeight() {
            return getHeight();
        }
    }
    class RolloverIcon extends OvalIcon {
        @Override
        public void paintIcon(Component c, Graphics g, int x, int y) {
            ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.setColor(getBackground().darker());
            g.fillOval(0, 0, getIconWidth(), getIconHeight());
        }
    }
    class PressedIcon extends OvalIcon {
        @Override
        public void paintIcon(Component c, Graphics g, int x, int y) {
            ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.setColor(getBackground().darker().darker());
            g.fillOval(0, 0, getIconWidth(), getIconHeight());
        }
    }
}
 
Zuletzt bearbeitet:

data89

Bekanntes Mitglied
Danke! Es lag wirklich daran, dass ich nicht die x und y-Koordinate genommen habe!

Aber es hat sich ein neues Problem ergeben: da ja um den Button herum ja nur das Panel neu geziechnet wird und nicht das ganze Panel, habe ich ein Problem, denn ich arbeite ja mit Farbverläufen:
bspb5bccc7fpng.png

Daher passt das dann nicht mehr, wenn nur ein Ausschnitt gezeichnet werden soll ... Was kann ich denn nun machen?

EDIT:
Wie ist es, wenn man folgendermaßen vorgeht:
Java:
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		int width = this.getSize().width;
		int height = this.getSize().height;
                Graphics2D g2d = (Graphics2D)g;
                // hier kann ich alles (mit width/height) neu zeichnen und nur der Ausschnitt wird angezeigt
                // getestet: scheint zu funktionieren
       }
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D SWING AWT - Komponenten komplett verschwinden lassen AWT, Swing, JavaFX & SWT 6
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
BabySuna Swing Komponenten auslagern auf separate Datei AWT, Swing, JavaFX & SWT 8
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
P AWT Einzelne Komponenten zur Laufzeit austauschen? AWT, Swing, JavaFX & SWT 3
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
F Gebundene Eigenschaften bei Komponenten mit NetBeans verarbeiten AWT, Swing, JavaFX & SWT 3
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
dereki2000 Swing JFrame nah hinzufügen von Komponenten akualisieren. AWT, Swing, JavaFX & SWT 2
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
T Reihenfolge der Komponenten im einem JFrame AWT, Swing, JavaFX & SWT 8
P Gleichmäßige Anodnung von Komponenten im migLayout AWT, Swing, JavaFX & SWT 2
DaCrazyJavaExpert Swing Komponenten genauer anordnen. AWT, Swing, JavaFX & SWT 13
DaCrazyJavaExpert Swing Komponenten in GridBagLayout werden Falsch angeordnet AWT, Swing, JavaFX & SWT 1
P Größe und Ausrichtung von Komponenten festlegen AWT, Swing, JavaFX & SWT 13
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
N Swing Wie Programm strukturieren? (Dynamisch Komponenten hinzufügen) AWT, Swing, JavaFX & SWT 1
Neumi5694 LookAndFeel Look & Feel nicht angezeigter Komponenten ändern AWT, Swing, JavaFX & SWT 6
D JavaFX GUI Komponenten werden langsam bei größerer Datenmenge AWT, Swing, JavaFX & SWT 6
R Komponenten von JPanel bleiben unsichtbar AWT, Swing, JavaFX & SWT 2
D JavaFX Welche Komponenten vermisst ihr? Welche wären essenziell notwendig? AWT, Swing, JavaFX & SWT 8
M Datei mit Komponenten einbinden AWT, Swing, JavaFX & SWT 7
T SWT Externer zugrif auf SWT Komponenten AWT, Swing, JavaFX & SWT 3
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
J MouseOver bei Komponenten AWT, Swing, JavaFX & SWT 9
S Größe der Komponenten, beim ändern der größe des Frames, mit ändern! AWT, Swing, JavaFX & SWT 2
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
G Komponenten vergrößern sich nicht trotz Layoutmanager AWT, Swing, JavaFX & SWT 24
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A Swing per JComboBox gewünschtes Attribut auswählen und Komponenten passen sich an AWT, Swing, JavaFX & SWT 7
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
S BoxLayout: Anordnung der Komponenten links statt zentriert AWT, Swing, JavaFX & SWT 0
Bartertown JTable - Verschiedene Komponenten in einer Spalte unterbringen AWT, Swing, JavaFX & SWT 3
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
G Applet Applet Komponenten flackern AWT, Swing, JavaFX & SWT 10
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
M Komponenten übereinander AWT, Swing, JavaFX & SWT 7
R Komponenten werden erst nach maximierung des Frames sichtbar (Linux) AWT, Swing, JavaFX & SWT 5
H Swing Getter für GUI-Komponenten AWT, Swing, JavaFX & SWT 3
B Komponenten in Fenster verdrängen sich untereinander AWT, Swing, JavaFX & SWT 6
N Komponenten übereinander AWT, Swing, JavaFX & SWT 3
S Anordnung von GUI-Komponenten mit LayouManger (Problem beim anzeigen von JTextField) AWT, Swing, JavaFX & SWT 5
M Swing Komponenten enablen? AWT, Swing, JavaFX & SWT 4
X Java Komponenten jeder Zeit hinzufügen können AWT, Swing, JavaFX & SWT 3
S View-Komponenten im Controller bekannt machen AWT, Swing, JavaFX & SWT 7
D Grafische Komponenten komplett neu aufbauen (Neukonstruktion) AWT, Swing, JavaFX & SWT 5
A AWT Komponenten in JavaFX einbetten AWT, Swing, JavaFX & SWT 9
M Swing Komponenten erscheinen beim darüberfahren? AWT, Swing, JavaFX & SWT 7
H Komponenten unmittelbar nach dem Ausführen teilweise unsichtbar AWT, Swing, JavaFX & SWT 3
K GUI in Komponenten aufteilen (MVC) AWT, Swing, JavaFX & SWT 2
W Funktionen, sowie aufruf einiger Komponenten AWT, Swing, JavaFX & SWT 4
J Alle Komponenten eines JFrames durchlaufen AWT, Swing, JavaFX & SWT 2
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
T Unter JPanel liegende Komponenten "totschalten" AWT, Swing, JavaFX & SWT 5
morphesus Swing Komponenten werden nicht angezeigt AWT, Swing, JavaFX & SWT 8
C Swing Reihenfolge der Initialisierung von Komponenten AWT, Swing, JavaFX & SWT 6
Asamandra LayoutManager GridBagLayout - Komponenten (mit fill?) vergrößern aber Proportionen dabei erhalten? AWT, Swing, JavaFX & SWT 3
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 7
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 2
W Bildgröße automatisch an Komponenten anpassen AWT, Swing, JavaFX & SWT 3
TheWhiteShadow Swing Komponenten organisieren AWT, Swing, JavaFX & SWT 9
S Überlappung zweier Komponenten AWT, Swing, JavaFX & SWT 12
Z größe der komponenten bestimmen AWT, Swing, JavaFX & SWT 16
C GUI-Komponenten skalieren AWT, Swing, JavaFX & SWT 10
M Seltsames Problem mit Resize eines Fensters und seiner Komponenten AWT, Swing, JavaFX & SWT 2
D Swing Komponenten verstecken AWT, Swing, JavaFX & SWT 4
X Swing Resizing der Komponenten innheralb eines Panels AWT, Swing, JavaFX & SWT 2
T Swing Font für alle Komponenten ändern AWT, Swing, JavaFX & SWT 2
S Problem mit Swing Komponenten AWT, Swing, JavaFX & SWT 11
A Swing Alle Komponenten auf JFrame ermitteln AWT, Swing, JavaFX & SWT 4
E LookAndFeel Eigene Komponenten mit Synth L&F stylen AWT, Swing, JavaFX & SWT 2
S Swing Frame und Klasse extends JPanel - Komponenten zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 18
S JButton und textfield.setText - Komponenten über-/verdecken sich AWT, Swing, JavaFX & SWT 15
M Komponenten übereinander prüfen AWT, Swing, JavaFX & SWT 3
W LayoutManager GridBag richtig nutzen - Komponenten richtig anordnen und automatisch vergrößern AWT, Swing, JavaFX & SWT 5
M Komponenten in anderer Reihenfolge anzeigen AWT, Swing, JavaFX & SWT 4
G swing Komponenten verrutschen ständig... AWT, Swing, JavaFX & SWT 6
D Mit GridBayLayout Komponenten anordnen AWT, Swing, JavaFX & SWT 6
N Window transparent, Komponenten nicht transparent AWT, Swing, JavaFX & SWT 11
R Farbänderung von Komponenten wird nicht wirksam AWT, Swing, JavaFX & SWT 7
P Swing Hierachie oder Reihenfolge von Komponenten AWT, Swing, JavaFX & SWT 5
T Sich überlappende Komponenten AWT, Swing, JavaFX & SWT 2
D Swing Probleme beim Anzeigen der einzelnen Komponenten AWT, Swing, JavaFX & SWT 16
R Swing Komponenten klein angezeigt AWT, Swing, JavaFX & SWT 10
D Swing Swing Komponenten verschieben AWT, Swing, JavaFX & SWT 7
B Komponenten nach Skalierung nicht mehr ansprechbar AWT, Swing, JavaFX & SWT 9
Kr0e AWT Komponenten in JPanel AWT, Swing, JavaFX & SWT 6
JuliaOne Komponenten innerhalb eine JScrollpane werden auch ausserhalb davon gezeichnet! AWT, Swing, JavaFX & SWT 7
xehpuk Swing Komponenten werden durch setFont() winzig AWT, Swing, JavaFX & SWT 3
O Größe von Komponenten im JFrame manuell verändern AWT, Swing, JavaFX & SWT 2
H Komponenten anwendugsweit formatieren AWT, Swing, JavaFX & SWT 6
M Swing Komponenten mit fester Größe an Fensterrand(JFrame) AWT, Swing, JavaFX & SWT 2
A Komponenten zur Laufzeit entfernen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben