Come per monitorare la posizione del cursore in modo efficiente in Java?
-
19-09-2019 - |
Domanda
L'effetto che ho cercato di creare è che l'icona del cursore del mouse cambia ogni volta che il mouse entra in una certa zona in un JPanel, e passa di default ogni volta che lascia la zona. Sto utilizzando la funzione MouseMoved nella classe MouseMotionListener, che quando il mouse passa sopra il JPanel verifica se le coordinate corrispondono alla zona speciale.
Tuttavia, la tensione sul processore del computer è molto alta con questo metodo, così ho voluto chiedere se c'è un modo più efficiente di farlo. Ogni aiuto è apprezzato.
Che cosa fa il programma è disegna figure su un JPanel, e quando il pulsante di connessione è selezionata, si connette quelle figure con una linea se l'utente fa clic su una figura, e poi su un altro.
I dati sono disegnati sulla JPanel, e hanno i loro rispettivi limiti di regione memorizzati, in modo che quando il mouse viene spostato controlla se la corrente X e coordinate Y sono all'interno di uno di tali regioni, e se così cursore. Il checkValidConnectionRegion controlla per vedere se la corrente X e Y sono variabili all'interno regione di una figura. Ecco il codice per il gestore:
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));
}
}
Soluzione
Non ho familiarità con Java, ma il problema potrebbe essere che Cursor.getPredefinedCursor
sta creando una nuova istanza del cursore ogni volta che si chiama. (Non so se questo è vero)
Prova a fare due campi final
nella tua classe per i due cursori e impostandole solo una volta.
Inoltre, solo provare stetting il cursore se validConnectionRegion
effettivamente cambiato.
Ad esempio:
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);
}
}
Altri suggerimenti
Un approccio più efficace sarebbe quella di aggiungere un JPanel
bambino al JPanel
genitore, che agirebbe come l'area invisibile. Poi basta posizionare il cursore sulla JPanel
bambino e il puntatore del mouse dovrebbe cambiare quando si sposta su di esso.
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);
Probabilmente stai esecuzione di codice inefficiente nel gestore MouseMoved.
Puoi pubblicare l'intera origine per il gestore MouseMoved?