Domanda

Come posso disegnare qualcosa in JPanel che rimarrà lo stesso e non verrà ridipinto, sto facendo un programma di simulazione del traffico e voglio che la strada venga tracciata una volta perché non cambierà. Grazie

È stato utile?

Soluzione

Non sono sicuro che in realtà non desideri che la tua strada non venga mai ridipinta: ridipingi gli eventi (ad esempio) quando la finestra viene ridimensionata o quando diventa visibile seguendo un'altra finestra che la ostruisce. Se il tuo pannello non ridisegna mai, sembrerà strano.

Per quanto mi ricordi, Swing lancerà solo eventi di vernice appropriati per queste circostanze, quindi dovresti essere OK seguendo il solito metodo di sottoclasse JPanel con una sostituzione adeguata:

public class RoadPanel extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // your drawing code here
    }
}

Se si memorizza nella cache la strada in un'immagine o in un altro formato grafico (per salvare il calcolo dei dati di visualizzazione più volte) una volta disegnato una volta, ciò potrebbe farti risparmiare un po 'di tempo sulle vernici successive.

Altri suggerimenti

Per quanto ne so, no, a meno che non ci sia un trucco con sovrapposizioni trasparenti.

La maggior parte delle applicazioni grafiche che ho visto (e fatto) hanno semplicemente ridisegnato l'intero pannello su ogni ridisegno. Ora puoi farlo una volta, in un buffer grafico, e poi semplicemente dipingere tutto lo sfondo in una volta, rapidamente, copiando il buffer grafico su JPanel. Dovrebbe essere più veloce di chiamare tutti i primitivi grafici per disegnare la strada.

Oppure, come fanno alcuni giochi 2D, forse dipingilo una volta e aggiorna le parti in movimento, come gli sprite: deve cancellare il vecchio posto usato dagli sprite (ripristinare lì lo sfondo) e ridisegnare gli sprite sul nuovo posto. Quindi hai ancora una copia della strada in un buffer grafico ma invece di ridisegnarla ogni volta, aggiorni solo alcune piccole parti. Può essere leggermente più veloce.

Il componente dovrà essere riverniciato ogni volta che il pannello viene oscurato (ovvero frame minimizzato / un'altra finestra posta in primo piano). Pertanto, disegnare qualcosa solo una volta non funzionerà come desiderato. Per fare in modo che le parti che non cambiano vengano disegnate in modo più efficiente, è possibile disegnarle una volta su un'immagine "buffer", quindi disegnare questo buffer ogni volta che è necessario ridisegnare il pannello o il componente.

// Field that stores the image so it is always accessible
private Image roadImage = null;
// ...
// ...
// Override paintComponent Method
public void paintComponent(Graphics g){

  if (roadImage == null) {
      // Create the road image if it doesn't exist
      roadImage = createImage(width, height);
      // draw the roads to the image
      Graphics roadG = roadImage.getGraphics();
      // Use roadG like you would any other graphics
      // object to draw the roads to an image
  } else {
      // If the buffer image exists, you just need to draw it.
      // Draw the road buffer image
      g.drawImage(roadImage, 0, 0, null);
  }
  // Draw everything else ...
  // g.draw...
}

Quello che faccio è impostare un valore booleano sull'opportunità o meno di ridisegnare una determinata parte. Quindi, nel metodo paintComponent () posso controllare il valore e ridisegnare la cosa, oppure no.

protected void paintComponent(Graphics g){
    super.paintComponent(g);
    if (drawRoad) {
        drawRoadMethod(g);
    }
    drawTheRest(g);
}

Un po 'così.

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