ContentPane lösche linien

irgendetwas

Mitglied
Ich will das bei diesem Programm, welches ich einfacherheitshalber gekürzt habe, die Linien welche ich dem ContentPane hinzufüge gelöscht werden und nur die neuste Linie angezeigt wird, also dass bevor ich eine neue Linie dem ContentPane hinzufuegen mit g.drawLine(); die alte gelöscht wird und nicht so ein chaos entsteht. Danke
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.*;

public class GUI extends JFrame
{

	public GUI() {
		setTitle("Travelling Salesman");
	
		setBounds(0, 0, Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
		getContentPane().setBackground(Color.white);
		setLayout(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false);

		addMouseMotionListener(new MouseMotionAdapter()
		{
			
			@Override
			public void mouseDragged(MouseEvent e) {
				Graphics g = GUI.this.getGraphics();
				g.drawLine(0, 0, e.getX(), e.getY());	
			}
		});

		setVisible(true);
	}
	
	public static void main(String[] args) {
		new GUI();
	}
}
 
Verschiebe, minimiere oder resize doch das Fenster vor jeder deiner Drags.
Worauf ich mit dieser, zugegebener Maßen zynischen, Bemerkung hinaus will ist, dass man unter KEINEN Umständen getGraphics verwenden sollte, da das Ergebnis werder vorhersagbar noch reproduzierbar ist. Das was du über getGraphics zeichnest, ist futsch, sobald das zugehörige Component neugezeichnet wird, sei es ausgelöst durch Userinteraktion (wie angedeutet) oder sei es durch Code angestoßen (z.B. Animation).

Dr richtige Weg wäre, eine Subklasse von JComponent zu erstellen und in dieser paintComponent(Graphics g) zu überschreiben. So könntest du z.B. Anfangs- und Endpunkt der Linie als Instanzvariablen speichern, diese bei jedem Dragged-Event setzten und dann repaint() auf dem Component aufrufen (was das neuzeichen durch Swing anstößt). Da beim aufruf von paintComponent alles alte gelöscht wird, löst sich dein Problem dadurch von alleine.
 

Zurück
Oben