Performance bei mouseMoved(...)

Status
Nicht offen für weitere Antworten.

java123

Mitglied
Hi!

Ich habe ein Problem. Und zwar möchte ich gerne meinen Code verbessern, aber hab keine Idee wie. Die Oberfläche wird ungefär so aufgebaut:

Java:
class MyPanel extends JPanel
{
	private ArrayList<MyObject> objects = new ArrayList<MyObject>();

	public MyPanel()
	{
		addMouseMotionListener(new MyMouseMotionListener());
	}

	public MyObject getObjectAt(int x, int y)
	{
		for (MyObject o: objects)
		{
			if (x > o.x_pos_ && x < o.x_pos_ + O_SIZE &&
			y > o.y_pos_ && y < o.y_pos_ + O_SIZE)
				return o;
		}
	}

	public void paintComponent(Graphics g) 
	{
		for (MyObject o: objects)
		{
			o.paint(g);
		}
	}
}

class MyObject
{
	public void paint(Graphics g)
	{
		g.fillRect(x, y, xSize, ySize);
	}
}


class MyMouseMotionListener implements MouseMotionListener
{
	public void mouseMoved(MouseEvent e)
	{
		if (getObjectAt(e.getX(), e.getY()) != null) showToolTip();
	}
}
Wenn ich nun die Maus über das Panel bewege wird natürlich verdammt oft die Funktion getObjectAt(int x, int y) aufgerufen um zu schauen ob sich der Mauszeiger innerhalb eines gezeichneten Objekts befindet. Das geht bestimmt besser.

Irgendwelche Ideen/Pattern?

Grüße!
 

Marco13

Top Contributor
Jein. Die Liste durchgehen und die Abfrage in dieser Form zu machen ist schon SEHR schnell. Außerdem solltest du dir überlegen, wie Java herausfindet, ob der Mauszeiger z.B. über einem Button ist oder nicht: Jupp, da läuft auch sowas ähnliches ab.

Aber nur so was ähnliches. (Das ist der "Ja"-Teil des "Jein" ;) ). Wenn es um viele Objekte geht (also... mehr als 1000 oder sogar RICHTIG viele) dann kann (und sollte) man einen Trick verwenden, der bei Swing selbst schon durch die Struktur eines normalen GUIs praktisch eingebaut ist: Man kann eine "Bounding Volume Hierarchy" oder einen "Quadtree" erstellen. Das sind schonmal Web-Such-Stichworte. Wenn's Fragen dazu gibt, sag' bescheid.
 
S

SlaterB

Gast
wieviele Objekte sind denn in der Liste?
ab einer gewissen Zahl kann es sich lohnen, diese vorher im Raum zu verteilen:
http://www.java-forum.org/awt-swing-swt/84388-zugriff-auf-polyline-grafik.html#post526994
(ohne die Fachbegriffe von Marco13 ;) )

außerdem könntest du Arbeitsspeicher gegen Rechenzeit tauschen:
statt jedesmal o.x_pos_ + O_SIZE auszurechnen speicherst du auch die Obergrenze in einer Variablen,
oder wenn nicht, dann ziehe zumindest den Vergleich y > o.y_pos_ weiter nach vorne,
wenn der nicht erfüllt ist, dann muss gar nicht erst o.x_pos_ + O_SIZE berechnet werden ;)

---

wenn du über einem Objekt bist, dann merke dir das in einer Variablen
und prüfe bei den nächsten Events zuerst, ob du noch in dessen Grenzen bist,
wenn ja, dann brauchst du nicht die Liste durchlaufen,
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
für sehr häufiges Durchlaufen ist übrigens noch eine LinkedList minimal geeigneter als eine ArrayList,
bei höherem Speicherbedarf + Änderungsaufwand
 

java123

Mitglied
Ok, danke für die schnellen Antworten. Da es wohl bei Objektmengen < 200 bleiben wird habe ich folgenden Teil geändert:
Java:
private LinkedList<MyObject> objects = new LinkedList<MyObject>();
private MyObject current = new MyObject();
 
	public MyObject getObjectAt(int x_pos, int y_pos)
	{
		if (xyInObject(x_pos, y_pos, current))
			return current;
			
		for (MyObject o: objects)
		{
			if (xyInObject(x_pos, y_pos, o))
			{
				current = o;
				return o;
			}
		}
		
		return null;
	}
	
	private boolean xyInObject(int x, int y, MyObject o)
	{
		if (x > o.x_pos_ && y > o.y_pos_ && 
				x < o.x_pos_ + O_SIZE && y < o.y_pos_ + O_SIZE)
			return true;
		return false;
	}
Denke das passt nun so :)

Grüße!
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
missy72 JavaFX Performance / ImageView in TableView über TimeLine AWT, Swing, JavaFX & SWT 1
L JavaFX ListCell Performance AWT, Swing, JavaFX & SWT 10
E Swing Miserable Performance beim Ändern der Hintergrundfarbe von JLabels AWT, Swing, JavaFX & SWT 3
W Swing Performance bei Griderstellung verbessern AWT, Swing, JavaFX & SWT 15
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
I JavaFX Graphics Performance AWT, Swing, JavaFX & SWT 2
S Swing Performance bei Verschachtelung problematisch AWT, Swing, JavaFX & SWT 0
R Performance Drag and Drop & Timer AWT, Swing, JavaFX & SWT 3
O AWT Performance und Bug behebung[brauche Hilfe] AWT, Swing, JavaFX & SWT 2
T Swing Allgemeines Problem mit der Performance bei DragAndDrop AWT, Swing, JavaFX & SWT 2
T Prüfen ob 2 JLabel übereinander liegen. Performance Problem. AWT, Swing, JavaFX & SWT 5
S Swing Lauftext Performance Probleme, in größerer Anwendung AWT, Swing, JavaFX & SWT 6
B Performance-Probleme AWT, Swing, JavaFX & SWT 17
D DefaultTableCellRenderer - Performance AWT, Swing, JavaFX & SWT 3
hdi Swing [Umfrage] Swing Performance AWT, Swing, JavaFX & SWT 27
B 2D-Grafik BufferedImage Performance AWT, Swing, JavaFX & SWT 3
C Performance-Problem beim Überschreiben von paintComponent() AWT, Swing, JavaFX & SWT 2
Hausmeister JTable mit Bildern - Performance AWT, Swing, JavaFX & SWT 5
J JTree Performance AWT, Swing, JavaFX & SWT 2
Developer_X Swing Graphics2D translate zerstört performance AWT, Swing, JavaFX & SWT 2
hdi Swing JTable: Mein CellRenderer ist ein Performance-Killer? AWT, Swing, JavaFX & SWT 7
L JFreeChart - Performance bei PNG-Erstellung AWT, Swing, JavaFX & SWT 5
P seltsame Performance Probleme bei 2 Guis abhängig vom Aufruf AWT, Swing, JavaFX & SWT 8
G Performance beim Zeichnen erhöhen? AWT, Swing, JavaFX & SWT 21
hdi bitte um performance ratschläge AWT, Swing, JavaFX & SWT 31
G performance fragen zu AWT, Swing AWT, Swing, JavaFX & SWT 14
T (Java 6) Thumbnails in JFileChooser - Performance steigern? AWT, Swing, JavaFX & SWT 3
hdi schlechte performance bei simplem swing AWT, Swing, JavaFX & SWT 9
G Probleme mit Performance bei einer Tabelle AWT, Swing, JavaFX & SWT 16
M Performance SWT ??? AWT, Swing, JavaFX & SWT 8
D performance problem: paintcomponent, alphacomp, bufferedImag AWT, Swing, JavaFX & SWT 10
P SWT: StyledText Performance steigern? AWT, Swing, JavaFX & SWT 2
T Performance Problem bei BufferedImage AWT, Swing, JavaFX & SWT 3
P SWT Performance : "Text" - Ausgabe beschleunigen ? AWT, Swing, JavaFX & SWT 21
O performance g2d.drawImage() AWT, Swing, JavaFX & SWT 17
D Performance Probleme Jtable AWT, Swing, JavaFX & SWT 4
N Performance (BufferStrategy?) AWT, Swing, JavaFX & SWT 2
F Problem mit Transparenz, MouseEvents und Performance AWT, Swing, JavaFX & SWT 3
O LookAndFeel und Performance AWT, Swing, JavaFX & SWT 7
W Performance verbessern AWT, Swing, JavaFX & SWT 2
S TableCellRenderer, Performance AWT, Swing, JavaFX & SWT 9
S Performance-Problem: JTextArea als Logging-Window AWT, Swing, JavaFX & SWT 8
D Event Handling "Plötzlich" kein mouseMoved-Event AWT, Swing, JavaFX & SWT 2
B Probleme mit mouseMoved? AWT, Swing, JavaFX & SWT 2
O Editor in JTable mit mouseMoved aufrufen? AWT, Swing, JavaFX & SWT 2
T mousemoved abfrage - aber welches event wenn maus weg? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben