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));
        }
    }
È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top