Swing JPanel Inhalt wird bei verwenden von JPopup gelöscht

hierUndDa

Mitglied
Hallo zusammen,

Ich versuche mich gerade an Java Swing. Ich möchte gerne ein Popup-Menu in eine JPanel implementieren. Das Popup-Menu funktioniert jetzt, jedoch verschwindet der vorherige Inhalt.
(siehe Beispiel). Wie kann ich meinen vorherigen Inhalt erhalten?

Grüsse
hierUndDa

Java:
package ursuppe_gui;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;

public class SimplePopUp extends JFrame {
	JPanel panel;
	
	public static void main(String[] args) {
		new SimplePopUp("SimplePopUp");
	}
	
	public SimplePopUp(String title) {
		super(title);
		makeGui();
		makePicture();
	}

	private void makePicture() {
		panel = new JPanel();
		this.add(panel);
		panel.addMouseListener(new PopupListener());
		
		this.repaint();
	}
	
	public void paint(Graphics g) {
		Graphics2D g2d = (Graphics2D) g;
		g2d.fillRect(100, 100, 100, 100);
	}

	private void makeGui() {
		this.setSize(500, 500);
		this.setVisible(true);
	}

	class PopupListener extends MouseAdapter {

		@Override
		public void mouseClicked(MouseEvent arg0) {
			int x = arg0.getX();
			int y = arg0.getY();
			JPopupMenu popUp = new JPopupMenu();
			popUp.add(new JMenuItem("Bling!"));
			popUp.add(new JMenuItem("Blupp!"));
			popUp.show(panel, x, y);
		}
	}
}
 
halte dich bitte an die Regeln, statt außerhalb der Regeln irgendwas anderes zu machen,
einfacher Ratschlag, oder? 😉

Galileo Computing :: Java ist auch eine Insel – 20 Grafikprogrammierung

20.1.1 Die paint()-Methode für das AWT-Frame

[..]



20.1.2 Zeichnen von Inhalten auf ein JFrame

Wenn Swing eine Komponente zeichnet, ruft es automatisch die Methode paint() auf. Um eine Grafik selbst in ein Fenster zu zeichnen, ließe sich von JFrame eine Unterklasse bilden und paint() überschreiben – das ist jedoch nicht der übliche Weg.

Stattdessen wählen wir einen anderen Ansatz, der sogar unter AWT eine gute Lösung ist.
[..]

-----

grundsätzlich ist außerdem zu vermeiden, was gar nicht erst direkt erwähnt wird,
in einer Komponente gleichzeitig zu zeichnen UND noch Unterkomponenten einzufügen
 
Es gibt eine hübsche Methode dafür.
Java:
JPanel panel = new JPanel();
panel.setComponentPopupMenu(popup);

😳
 
:autsch: Ach bin ich blöd... Problem gelöst. Einfach eigenes JPanel erstellt, dass von JPanel erbt und dort meine paint()-Methode hinkopiert.

Danke schön!

Java:
package ursuppe_gui;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;

public class SimplePopUp extends JFrame {
	JPanel panel;
	
	public static void main(String[] args) {
		new SimplePopUp("SimplePopUp");
	}
	
	public SimplePopUp(String title) {
		super(title);
		makeGui();
		makePanel();
		makePicture();
	}

	private void makePanel() {
		panel = new SimplePopUpPanel();
		this.add(panel);
		panel.addMouseListener(new PopupListener());
	}

	private void makePicture() {		
		this.repaint();
	}

	private void makeGui() {
		this.setSize(500, 500);
		this.setVisible(true);
	}

	class PopupListener extends MouseAdapter {

		@Override
		public void mouseClicked(MouseEvent arg0) {
			int x = arg0.getX();
			int y = arg0.getY();
			JPopupMenu popUp = new JPopupMenu();
			popUp.add(new JMenuItem("Bling!"));
			popUp.add(new JMenuItem("Blupp!"));
			popUp.show(panel, x, y);
		}
	}
}

class SimplePopUpPanel extends JPanel {
	public void paint(Graphics g) {
		Graphics2D g2d = (Graphics2D) g;
		g2d.fillRect(100, 100, 100, 100);
	}
}
 

Zurück
Oben