Pregunta

¿Cómo puedo dibujar algo en JPanel que se mantenga igual y no se vuelva a pintar? Estoy haciendo un programa de simulación de tráfico y quiero que el camino se dibuje una vez porque no cambiará. Gracias

¿Fue útil?

Solución

No estoy seguro de que realmente quieras que tu camino nunca se vuelva a pintar: los eventos de repintado se disparan (por ejemplo) cuando tu ventana cambia de tamaño, o cuando se hace visible después de otra ventana que la obstruye. Si su panel nunca se vuelve a pintar, entonces se verá peculiar.

Hasta donde recuerdo, Swing solo disparará eventos de pintura apropiados para estas circunstancias, por lo que debería estar bien siguiendo el método habitual de subclasificar JPanel con una anulación adecuada:

public class RoadPanel extends JPanel {

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

Si guarda la carretera en una imagen u otro formato de gráficos (para guardar el cálculo de los datos de la pantalla varias veces) una vez que se dibuja una vez, esto podría ahorrarle algo de tiempo en las pinturas posteriores.

Otros consejos

Que yo sepa, no, a menos que haya un truco con superposiciones transparentes.

La mayoría de las aplicaciones gráficas que vi (e hice) simplemente volvieron a dibujar todo el panel en cada repintado. Ahora, puede hacerlo una vez, en un búfer gráfico, y luego simplemente pintar todo el fondo a la vez, rápidamente, copiando el búfer gráfico en el JPanel. Debería ser más rápido que llamar a todas las primitivas gráficas para dibujar el camino.

O, como hacen algunos juegos en 2D, tal vez pintarlo una vez y actualizar las partes móviles, como los sprites: necesita borrar el antiguo lugar utilizado por los sprites (restaurar el fondo allí) y volver a dibujar los sprites en el nuevo lugar. Por lo tanto, todavía tiene una copia del camino en un búfer gráfico, pero en lugar de volver a dibujarlo todo cada vez, actualiza solo algunas partes pequeñas. Puede ser un poco más rápido.

El componente deberá volver a pintarse cada vez que se oculte el panel (es decir, marco minimizado / otra ventana colocada en la parte superior). Por lo tanto, dibujar algo solo una vez no funcionará como lo desea. Para hacer que las partes que no cambian se dibujen de manera más eficiente, puede dibujarlas una vez en una imagen de "búfer", y luego simplemente dibujar este búfer cada vez que el panel o componente necesite volver a dibujarse.

// 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...
}

Lo que hago es establecer un valor booleano para determinar si una determinada parte necesita ser redibujada o no. Luego, en el método paintComponent () puedo verificar el valor y volver a dibujar cierta cosa, o no.

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

Un poco así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top