2009-08-26 5 views
0

Der Effekt, den ich versuche zu erstellen, besteht darin, dass sich das Mauscursor-Symbol ändert, wenn die Maus in eine bestimmte Zone eines JPanels eindringt, und beim Verlassen der Zone auf Standard wechselt. Ich verwende die MouseMoved-Funktion in der MouseMotionListener-Klasse, die überprüft, wenn die Maus über das JPanel bewegt, ob die Koordinaten dem speziellen Bereich entsprechen.Wie kann die Cursorposition in Java effizient verfolgt werden?

Allerdings ist die Belastung des Computerprozessors mit dieser Methode sehr hoch, also wollte ich fragen, ob es einen effizienteren Weg gibt. Jede Hilfe wird geschätzt.

Was das Programm macht, ist das Zeichnen von Zahlen auf einem JPanel, und wenn die Schaltfläche Verbindung ausgewählt ist, verbindet es diese Figuren mit einer Linie, wenn der Benutzer auf eine Figur und dann auf eine andere klickt.

Die Zahlen sind auf dem JPanel gezeichnet, und ihre jeweiligen Regionsgrenzen sind gespeichert. Wenn die Maus bewegt wird, prüft sie, ob die aktuellen X- und Y-Koordinaten innerhalb einer dieser Regionen liegen und ändert den Cursor. Die checkValidConnectionRegion prüft, ob die aktuellen X- und Y-Variablen innerhalb der Region einer Figur liegen. Hier ist der Code für den Handler:

public void mouseMoved(MouseEvent e) 
    { 
     if(GUI.Connectionbutton.isSelected()) 
     { 
      x = e.getX(); 
      y = e.getY(); 

      checkValidConnectionRegion(); 

      if(validConnectionRegion) 
       setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); 
      if(!validConnectionRegion) 
       setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
     } 
    } 

Antwort

2

Ich bin mit Java nicht vertraut, aber das Problem könnte sein, dass Cursor.getPredefinedCursor eine neue Cursor-Instanz erstellen jedes Mal wenn Sie es nennen. (Ich weiß nicht, ob das stimmt)

Versuchen Sie zwei final Felder in Ihrer Klasse für die zwei Cursor und setzen sie nur einmal.

Versuchen Sie auch nur, den Cursor zu setzen, wenn validConnectionRegion tatsächlich geändert wird.

Zum Beispiel:

final Cursor crosshairCursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); 
final Cursor defaultCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); 

public void mouseMoved(MouseEvent e) 
{ 
    if(GUI.Connectionbutton.isSelected()) 
    { 
     x = e.getX(); 
     y = e.getY(); 

     boolean wasValid = validConnectionRegion; 
     checkValidConnectionRegion(); 

     if(wasValid != validConnectionRegion) 
      setCursor(validConnectionRegion ? crosshairCursor : defaultCursor); 
    } 
} 
2

Sie führen wahrscheinlich ineffizienten Code in Ihrem MouseMoved-Handler.

Können Sie die gesamte Quelle für Ihren MouseMoved-Handler veröffentlichen?

+0

Ordnung Ich werde die Frage bearbeiten und nach dem Code. – Hans

5

Ein effizienterer Ansatz wäre das Hinzufügen eines untergeordneten Elements JPanel zum übergeordneten Element JPanel, das als unsichtbarer Bereich fungieren würde. Dann setzen Sie einfach den Cursor auf das Kind JPanel und der Mauszeiger sollte sich ändern, wenn Sie darüber bewegen.

JPanel mainPnl = new JPanel(new BorderLayout()); 

JPanel invisibleArea = new JPanel(); 
invisibleArea.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 
invisibleArea.setPreferredSize(new Dimension(100, 100)); 

mainPnl.add(invisibleArea, BorderLayout.WEST); 
+0

Ich denke, dies wäre ein Weg, um es zu tun, aber ich würde die ganze Art ändern müssen, wie Zahlen gezeichnet werden. – Hans

+0

Hmm, oder ich könnte immer noch die Figuren auf dem Hauptfeld zeichnen, und wenn die "Verbindungstaste" ausgewählt ist, setze jeden unsichtbaren Bereich sichtbar. – Hans

Verwandte Themen