Pergunta sobre java, swing, multithreading, paint – Repintando Continuamente em Java

1

Eu tenho um programa em Java que usa threads. No meu método de execução, tenho:

<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>

O problema é que o método run é executado, mas opaintComponent seção não é chamada. Se esse não for o jeito certo de continuar repintando o componente, como devo repintá-lo?

É este bloco de código dentro de uma classe que estende umJComponent? (PorquepaintComponent() é umJComponent método). cgull
Tente suas mãos nesteexemploEspero que isso possa ajudar :-) nIcE cOw
Por favor, mostre-nos o código real com formatação decente. Seu código atual sugere que paintComponent édentro o método run () e isso não pode ser verdade. Então, novamente, edite sua pergunta, limpe o código o máximo possível e poste um código que faça sentido, código que você está usando no momento, e nos dê mais detalhes sobre o seu problema. Suponha que não sabemos nada sobre código não mostrado e que não podemos ler sua mente. Hovercraft Full Of Eels

Sua resposta

4   a resposta
0

Você tem que chamar paint (g) para um contêiner pesado, como um JFrame. Você chama paintComponent (g) para contêineres leves como um JButton. Veja se isso funciona.

5

Cal repintar de um balançoTimer. Isso não bloqueará a GUI e acontecerá em qualquer intervalo especificado no cronômetro. Naturalmente, pela natureza da pintura Swing / AWT, se o timer estiver configurado para repetir muito rápido, as chamadas para pintura podem ser unidas (efetivamente ignoradas).

Além disso, verifique se o métodoé uma substituição usando:

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

Dependendo do que você está fazendo, você também pode estar interessado nisso. Isso é tirado deProgramação de jogo assassino em Java por Andrew Davison. Ele fala sobrerenderização ativa. Seu loop de jogo é efetivamente:

<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>

E a implementação da tela de pintura é (definida por uma subclasse 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>

Do livro:

[Nota 1] A chamada paraTookkit.sync() garante que a exibição seja prontamente atualizada. Isso é necessário para o Linux, que não libera automaticamente seu buffer de exibição. Sem osync() chamada, a animação pode ser atualizada apenas parcialmente, criando um efeito de "rasgo".

3

Você só deve repintar um componente quando precisar (ou seja, quando você atualizá-lo).

@ Anonymous181 Então há um bug em outro lugar em seu código Jeffrey
@ Anonymous181: "não funciona" nos diz nada que podemos ser usado para ajudá-lo. Edite sua pergunta e considere postar informações suficientes que nos permitirão entender melhor seu problema. Hovercraft Full Of Eels
@ Anonymous181: toda a computação é discreta e nada é verdadeiramente contínuo, e isso inclui fatias de tempo. Seu loop de jogo deve escolher um intervalo de tempo razoável e repintar em seguida. O gerenciador de pintura Swing unirá seurepaint() solicita se eles vêm para jejuar e fechar. 1+ para a resposta. Hovercraft Full Of Eels
Ou acionar a repintura quando você atualizar algo ou usar um relógio. Não existe uma repintura "contínua". Hot Licks

Perguntas relacionadas