Pregunta sobre multithreading, paint, swing, java – Repintando continuamente en Java

1

Tengo un programa de Java que utiliza hilos. En mi método de ejecución, tengo:

<code>public void run() {
    while(thread != null){
        repaint();
        System.out.println("hi");
        try {  
            Thread.sleep(1000);  
        } catch (InterruptedException e) {  
            break;  
        }  
    }
}

public void paintComponent(Graphics g) {
    // painting stuff
}
</code>

El problema es que el método de ejecución se ejecuta, pero elpaintComponent La sección no se llama. Si esta no es la forma correcta de volver a pintar el componente, ¿cómo debo volver a pintarlo?

Por favor, nos muestran el código real con un formato decente. Su código actual sugiere que paintComponent esdentro El método run () y eso no puede ser cierto. Entonces, nuevamente, edite su pregunta, limpie su código lo más posible y publique un código que tenga sentido, el código que está utilizando actualmente y denos más detalles sobre su problema. Supongamos que no sabemos nada sobre el código que no se muestra y que no podemos leer su mente. Hovercraft Full Of Eels
¿Está este bloque de código dentro de una clase que extiende unJComponent? (porquepaintComponent() es unJComponent método). cgull
Prueba tus manos en estoejemploEsperemos que esto pueda ayudar :-) nIcE cOw

Tu respuesta

4   la respuesta
3

Solo debe volver a pintar un componente cuando lo necesite (es decir, cuando lo actualice).

@ Anónimo181: toda la computación es discreta y nada es realmente continuo, y eso incluye segmentos de tiempo. Tu bucle de juego debe elegir un tiempo razonable y luego repintar. El gerente de pintura Swing fusionará turepaint() Solicita si llegan a ayunar y cerrar. 1+ a la respuesta. Hovercraft Full Of Eels
@ Anónimo181 Luego hay un error en otra parte de tu código Jeffrey
@ Anonymous181: "no funciona" no nos dice nada que podamos usar para ayudarlo. Edite su pregunta y considere publicar suficiente información que nos permita comprender mejor su problema. Hovercraft Full Of Eels
@ Anónimo181 Si nada ha cambiado, no es necesario actualizar la pantalla. Siempre que actualice el estado del juego, debe decirle a su componente que se vuelva a pintar. Jeffrey
1

Dependiendo de lo que estés haciendo, también podrías estar interesado en esto. Esto es tomado deProgramación de juegos asesinos en Java por Andrew Davison. El habla derepresentación activa. Su bucle de juego es efectivamente:

<code>public void run()
{
  while (running)
  {
    gameUpdate();                             // game state is updated
    gameRender();                             // render to a buffer
    paintScreen();                            // draw buffer to screen

    try
    {
      Thread.sleep(20);
    }
    catch (InterruptedException e) {;}
  }
}
</code>

Y, la implementación de la pantalla de pintura es (definida por una subclase deJComponent):

<code>private void paintScreen()
{
  final Graphics2D g2d;

  try
  {
    g2d = (Graphics2D) this.getGraphics();
    if (g2d != null && (backbuffer != null))
    {
      g2d.drawImage(backbuffer, 0, 0, null);
    }

    Toolkit.getDefaultToolkit().sync();       // sync the display on some systems [1]
    g2d.dispose();
  }
  catch (Exception e)
  {
    ;
  }
}
</code>

Del libro:

[Nota 1] La llamada aTookkit.sync() asegura que la pantalla se actualice rápidamente. Esto es necesario para Linux, que no vacía automáticamente su búfer de pantalla. Sin elsync() llamada, la animación solo puede actualizarse parcialmente, creando un efecto de "rasgado".

0

Debe llamar a paint (g) para un contenedor de gran peso, como un JFrame. Usted llama a paintComponent (g) para contenedores livianos como un JButton. A ver si eso funciona.

5

Cal repintado desde un columpioTimer. Eso no bloqueará la GUI, y sucederá en el intervalo especificado en el temporizador. Por supuesto, debido a la naturaleza de la pintura Swing / AWT, si el temporizador se repite demasiado rápido, las llamadas a la pintura podrían fusionarse (efectivamente ignorarse).

Además, asegúrese de que el métodoes una anulación utilizando:

<code>@Override
public void paintComponent(Graphics g){
</code>

Preguntas relacionadas