Domanda

Ho creato una classe JButton personalizzato per rappresentare gli spazi su una tavola monopolio. Il gioco è multiplayer così un sacco di informazioni necessarie per elaborare il pulsante viene tenuto sul server (accessibile tramite RMI).

Il mio problema è che quando ho del mouse sul pulsante che sembra automaticamente chiamare repaint () (e disegna un confine). Questo rende il programma molto lento in quanto si trova a dover estrarre i dati dal server ogni volta che il mouse si trova sopra uno degli spazi.

Ho cercato di trovare un modo per fermare questo accada, ma tutti gli altri su internet sembra avere un problema con ottenere il pulsante per repaint () invece di fermarlo.

Qualcuno sa di un metodo che posso ignorare o una proprietà che posso cambiare per fermare questo accada?

È stato utile?

Soluzione

vorrei suggerire che riconsiderare il vostro disegno. Ammetto che io non conosco tutti i fattori in gioco, ma dalla tua descrizione, penserei che lo stato della scheda non cambia molto spesso, quindi non ci dovrebbe essere alcun motivo di chiamare al server con ogni tentativo di vernice. Invece, erano il server di eventi di gioco di trasmissione per il cliente, si avrebbe lo Stato è necessario a livello locale quando le chiamate repaint sono fatti.

Inoltre, dalla tua descrizione, sembra come se si potrebbe essere chiamando il server dal all'interno del codice repaint, innescato da eventi del mouse. Questo molto ben può essere fatto nel EDT. Non si dovrebbe essere fare chiamate di server nel tuo thread pittura, in quanto rallenta il resto della tua GUI. Lungo le chiamate in esecuzione devono essere effettuate in un thread di lavoro. Date un'occhiata a SwingWorker e concetti intorno filettatura in swing per ulteriori dettagli.

Anche così, non penso che pasticciano con la logica di ridipingere sarebbe la migliore linea d'azione. Fornendo il vostro pulsante con ciò di cui ha bisogno per rendere di per sé un passo migliore.

Altri suggerimenti

Non dovrebbe mai essere grandi calcoli nel repaint () (e vernice ()) i metodi di componenti a battente, lasciare chiamate al server solo ...

Naturalmente è possibile, ma non è semplice.

Qualunque cosa si sta cercando di dipingere sulla JButton, l'hanno discarica in un BufferedImage. La vernice () del vostro JButton dovrebbe essere essenzialmente tornando un'immagine tamponata. BufferedImages sono molto veloci durante ridipinge, sono solo una matrice di pixel e sarà difficilmente vorrà del tempo tra le ridipinge.

package test;

import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ButtonTest {
    public static void main(String[] args){
        new ButtonTest().test();
    }

    public void test(){
        JFrame frame = new JFrame("TestFrame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel pnl = new JPanel();
        pnl.add(new MyButton());
        frame.add(pnl);
        frame.setSize(600, 600);
        frame.setVisible(true);
    }

    class MyButton extends JButton{
        public void paint(Graphics g){
            //return a buffered image everytime
        }
    }
}

Anche se la tecnica di cui sopra sembra un po 'stupido, è possibile avere in sostanza una sola immagine tamponata nella memoria e che deve essere restituito dal metodo paint (). E qualunque roba che si ricevono dal server (RMI) può essere scaricato nell'oggetto BufferedImage utilizzando un thread separato in esecuzione in background.

Hai provato disabilitando il dipinto del confine messa a fuoco? Date un'occhiata a l'API JButton documentazione per i dettagli.

Inoltre, si potrebbe provare il caching dei dati che viene mostrato sul pulsante. E, un pulsante davvero appropriato per ciò che si sta cercando di fare? Ricordate, gli utenti si aspettano elementi GUI noti a reagire in un modo molto specifico.

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