Swing Kreis löschen durch Mausklick in der Nähe

Semox

Bekanntes Mitglied
Hi Forum

Auf einer Fläche habe ich viele schwarze Kreise mit einem Durchmesser von 20 px. Diese gemalten Punkte stecken in einer ArrayList vom Typ Point. Per Klick möchte ich nun einen Kreis löschen, sofern der Klick innerhalb der Kreisfläche stattgefunden hat. Ich wollte fragen warum das bei mir nicht klappt, sondern in einer Exception Meldung endet.

Java:
import java.util.ArrayList;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;

/**
 * Node ist eine Unterklasse von MyGraphEditor, mit dem im Program die Knoten
 * gezeichnet, geschoben und geloescht werden koennen (sollen)
 * 
 * @author carino
 * @version 1.6.0_20-b02
 * 
 */

public class NodePanel extends JPanel {

	private static final long serialVersionUID = 6887540707408099142L;

	private ArrayList<Point> AllNodes;
	Point p;
	final int dia = 20;

	public NodePanel() {
		super();
		setBackground(Color.WHITE);
		AllNodes = new ArrayList<Point>();
		this.addMouseListener(new MouseListener() {

			@Override
			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub

			}

			public void mousePressed(MouseEvent e) {
				if (Contents.selectedItem == 2) {
					if (AllNodes.contains(e.getPoint())) {
						// e.translatePoint(5, 5);
						// System.out.println(p.toString());
						// repaint();
					}
				}
			}

			@Override
			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub

			}

			@Override
			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub

			}

			public void mouseClicked(MouseEvent e) {
				if (Contents.selectedItem == 1) {
					p = e.getPoint();
					AllNodes.add(p);
					System.out.println(p.toString());
					paintComponent(getGraphics());
				} else if (Contents.selectedItem == 3) {
					p = e.getPoint();
					for (Point q : AllNodes) {
						if (p.distance(q) <= dia) {
							AllNodes.remove(q);
							paintComponent(getGraphics());
						}
					}
				}
			}
		});

	}

	/*
	 * Diese Methode zeichnet die Kreise in die Komponente JPanel
	 * 
	 * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
	 */

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2D = (Graphics2D) g;
		try {
			g2D.setColor(Color.BLACK);
			g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
					RenderingHints.VALUE_ANTIALIAS_ON);
			for (Point p : AllNodes) {
				g2D.fillOval(p.x - 10, p.y - 10, dia, dia);
			}
		} finally {
			g2D.dispose();
		}

	}
}

Vielleicht hilft auch die Exception-Meldung?

Java:
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
	at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
	at java.util.AbstractList$Itr.next(AbstractList.java:343)
	at NodePanel$1.mouseClicked(NodePanel.java:70)
	at java.awt.Component.processMouseEvent(Component.java:6266)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6028)
	at java.awt.Container.processEvent(Container.java:2041)
	at java.awt.Component.dispatchEventImpl(Component.java:4630)
	at java.awt.Container.dispatchEventImpl(Container.java:2099)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4247)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
	at java.awt.Container.dispatchEventImpl(Container.java:2085)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4460)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Wie immer danke ich für Eure Unterstützung.

EDIT: Einen HInweis habe ich schon. Aber ich weiß nicht wie man damit umgehen soll um das zu lösen:

For example, it is not generally permissible for one thread to modify a Collection while another thread is iterating over it. In general, the results of the iteration are undefined under these circumstances. Some Iterator implementations (including those of all the general purpose collection implementations provided by the JRE) may choose to throw this exception if this behavior is detected. Iterators that do this are known as fail-fast iterators, as they fail quickly and cleanly, rather that risking arbitrary, non-deterministic behavior at an undetermined time in the future.

Viele Grüße,
Semo
 

eRaaaa

Top Contributor
Richtig, genau daran liegts:
Java:
                    for (Point q : AllNodes) {
                        if (p.distance(q) <= dia) {
                            AllNodes.remove(q);
                            paintComponent(getGraphics());
                        }
                    }

a) paintComponent ruft man nicht selbst auf, rufe stattdessen repaint() auf ! (da wird das Graphics-Objekt dann auch automatisch eingefügt)
b) du könntest dir den Iterator holen(der durch die foreach verborgen bleibt) und dann auf diesem remove aufrufen:
Java:
		for (Iterator<Point> iterator = AllNodes.iterator(); iterator.hasNext();) {
			Point point = iterator.next();
			if(p.distance(q) <= dia){iterator.remove();this.repaint();}
		}

Ka ob das schon hilft ...
 

Semox

Bekanntes Mitglied
Hallo eRaaaa

Vielen Dank. Das war der richtige Hinweis. Zeile 62 bis 77 habe ich oben durch folgendes ersetzt. Jetzt geht es.

:toll:

Java:
public void mouseClicked(MouseEvent e) {
				if (Contents.selectedItem == 1) {
					p = e.getPoint();
					AllNodes.add(p);
					System.out.println(p.toString());
					repaint();
				} else if (Contents.selectedItem == 3) {
					Point q = new Point();
					q = e.getPoint();
					for (Iterator<Point> iterator = AllNodes.iterator(); iterator
							.hasNext();) {
						Point p = iterator.next();
						if (p.distance(q) <= dia) {
							iterator.remove();
							repaint();
						}
					}
				}
			}

Viele Grüße,
Semo
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
L 2D-Grafik Linie von Kreis zu Kreis AWT, Swing, JavaFX & SWT 3
S Kreis vergrößern/verkleinern mit Buttons AWT, Swing, JavaFX & SWT 1
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
L 2D-Grafik Dreieck in einem Kreis??? AWT, Swing, JavaFX & SWT 1
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
D Swing Manuellen Kreis zeichen AWT, Swing, JavaFX & SWT 22
T Kreis in Jlabel darstellen. AWT, Swing, JavaFX & SWT 13
J Grafik (Kreis) schneller bewegen? AWT, Swing, JavaFX & SWT 6
E Kreis-Mal-Programm AWT, Swing, JavaFX & SWT 7
S Kreis in Kreis AWT, Swing, JavaFX & SWT 5
P Elemente im Kreis aufstellen AWT, Swing, JavaFX & SWT 5
M 2D-Grafik "Unvollständiger" Kreis(kontur) AWT, Swing, JavaFX & SWT 8
T Einen Kreis anzeigen AWT, Swing, JavaFX & SWT 14
B 2D-Grafik Text in einem Kreis zentrieren AWT, Swing, JavaFX & SWT 3
Semox 2D-Grafik Radialer Verlauf in einem Kreis AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
P Swing FocusTraversalPolicy dreht sich im Kreis AWT, Swing, JavaFX & SWT 2
J Java2D Kreis/Kurven Frage AWT, Swing, JavaFX & SWT 2
Dit_ Ein Kreis als Graphics2D oder als Ellipse2D Objekt AWT, Swing, JavaFX & SWT 19
K Wenn Mauszeiger in der Nähe vom Kreis, soll Kreis an eine andere Stelle springen AWT, Swing, JavaFX & SWT 8
Spin Hilfe - Erklärungsbedarf für Kreis AWT, Swing, JavaFX & SWT 5
H Punkte im Kreis AWT, Swing, JavaFX & SWT 3
G kreis malen -> welche funktion? AWT, Swing, JavaFX & SWT 3
G Farbe ändern bei Klick auf einen Kreis AWT, Swing, JavaFX & SWT 5
M Kreis mit gedrückter Maus bewegen AWT, Swing, JavaFX & SWT 20
U Farbe von Kreis AWT, Swing, JavaFX & SWT 3
G Kreis zeichnen und mit Maus ziehen AWT, Swing, JavaFX & SWT 3
S Kreis als JFrame AWT, Swing, JavaFX & SWT 9
TheJavaKid Kreis, Rechteck, Linie. verschieben AWT, Swing, JavaFX & SWT 5
T Kreis ActionListener AWT, Swing, JavaFX & SWT 5
W Element aus comboBox mit observableList löschen AWT, Swing, JavaFX & SWT 3
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Fragerjava Frame inhalt komplett löschen AWT, Swing, JavaFX & SWT 4
missy72 JavaFX CellFactory deaktivieren, oder löschen AWT, Swing, JavaFX & SWT 2
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
C Swing Component bei Doppelklick löschen AWT, Swing, JavaFX & SWT 4
H JTabel Inhalt löschen AWT, Swing, JavaFX & SWT 1
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
R Swing Ein gezeichneten String aus dem JFrame löschen AWT, Swing, JavaFX & SWT 5
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
B JavaFX RadioButtons aus ToggleGroup löschen AWT, Swing, JavaFX & SWT 7
I GEmaltes BufferedImage löschen AWT, Swing, JavaFX & SWT 3
M JavaFX Altes Fenster (FXML Datei) löschen AWT, Swing, JavaFX & SWT 16
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
L Komplettes Löschen SWT vom System AWT, Swing, JavaFX & SWT 6
D JavaFX observablelist löschen AWT, Swing, JavaFX & SWT 3
H Swing Waypoints in JXMapKit löschen AWT, Swing, JavaFX & SWT 1
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
thobren JavaFX Ecken bei radius löschen AWT, Swing, JavaFX & SWT 2
C Swing JTextField Funktion zuweisen - Löschen von Buchstaben/Sonderzeichen AWT, Swing, JavaFX & SWT 6
G JPanel komponente Löschen AWT, Swing, JavaFX & SWT 7
A JFace Wizard: Ist es möglich eine Page zu löschen? AWT, Swing, JavaFX & SWT 2
J Text bei Eingabe löschen AWT, Swing, JavaFX & SWT 5
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
I Objekte aus contentPane löschen funktioniert nicht AWT, Swing, JavaFX & SWT 3
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
llabusch Prüfen ob JMenu leer ist & löschen AWT, Swing, JavaFX & SWT 1
N AWT Markierte Zeile jList aus mySQL DB löschen AWT, Swing, JavaFX & SWT 2
TheJavaKid JTextField: Reine Domain herausfiltern, sonst Inhalt löschen AWT, Swing, JavaFX & SWT 1
M JTable horizontale scrollbar löschen AWT, Swing, JavaFX & SWT 3
Bluedaishi JTable alle Zeilen löschen AWT, Swing, JavaFX & SWT 7
I ausgewählte Zeile mit Hilfe der Tastatur löschen! AWT, Swing, JavaFX & SWT 3
I JTable Inhalte löschen ohne den JTable zu verändern! AWT, Swing, JavaFX & SWT 5
I 2D-Grafik Shape aus BufferedImage "löschen" AWT, Swing, JavaFX & SWT 2
J Einträge aus Table löschen ohne Exception AWT, Swing, JavaFX & SWT 6
A 2D-Grafik Panel inhalt löschen AWT, Swing, JavaFX & SWT 5
H JCombobox inhalt löschen AWT, Swing, JavaFX & SWT 17
earlgrey_tea JTable Zelleninhalt beim Editieren löschen AWT, Swing, JavaFX & SWT 5
Kenan89 removeAll, um alles in einem JPanel zu löschen AWT, Swing, JavaFX & SWT 10
P Listenelemente über Checkbox löschen AWT, Swing, JavaFX & SWT 6
Ollek Swing JTable - Zeile löschen mit AbstractTableModel AWT, Swing, JavaFX & SWT 20
S Swing JTable Zeilen löschen AWT, Swing, JavaFX & SWT 21
4 AWT bestimmte Objekte zeichnen und löschen AWT, Swing, JavaFX & SWT 8
A JTable Zelle markieren von bis und Löschen AWT, Swing, JavaFX & SWT 6
S Swing AWT-Exception bei JTable mit JComboBox beim Löschen der letzten Zeile AWT, Swing, JavaFX & SWT 3
C JFrame - Löschen und neu füllen AWT, Swing, JavaFX & SWT 9
E Swing JTable Inhalte löschen..Was ist Sinnvoll? AWT, Swing, JavaFX & SWT 5
L Inhalt einer table löschen AWT, Swing, JavaFX & SWT 2
H Markierte Zeile löschen AbstractTableModel AWT, Swing, JavaFX & SWT 10
M [erledigt] Bestimmte Zeile aus JTextArea löschen AWT, Swing, JavaFX & SWT 3
F Swing JTable: Problem beim zeile löschen AWT, Swing, JavaFX & SWT 3
M Swing jList Auswahl löschen AWT, Swing, JavaFX & SWT 2
B Swing JList Daten löschen AWT, Swing, JavaFX & SWT 13
Pithecanthropus Swing Vordefinierten KeyStroke löschen AWT, Swing, JavaFX & SWT 3
S Java3D: Alle Objekte in BranchGroup löschen während Laufzeit AWT, Swing, JavaFX & SWT 3
J ArrayList Datensätze komplett löschen AWT, Swing, JavaFX & SWT 8
L ArrayList Wert löschen klappt nicht AWT, Swing, JavaFX & SWT 11
A Tabellen Spalte löschen AWT, Swing, JavaFX & SWT 6
S Comobox löschen AWT, Swing, JavaFX & SWT 10
U LayoutManager [GBL] Component aus einer Zelle löschen AWT, Swing, JavaFX & SWT 2
R JTable Zeile löschen AWT, Swing, JavaFX & SWT 4
B Fadenkreuze löschen und nicht "verstecken" AWT, Swing, JavaFX & SWT 10
X Keyevents nach Beartbeitung löschen AWT, Swing, JavaFX & SWT 2
E Spalte in JTable löschen AWT, Swing, JavaFX & SWT 4
hdi Swing JTable: Löschen vom Daten im Model AWT, Swing, JavaFX & SWT 7
Z JTextField Text löschen AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben