Problema no refresh do frame

6 respostas
V

Pessoal,

Estou desenvolvendo um frame que após clicar em um botão ele abre um novo frame.
Neste novo frame eu coloquei uma barra gráfica que de tempo em tempo atualiza. O problema é que não estou conseguindo atualizar a tela. Já tentei repaint, invalidate, validate, clearRect, e nada. O curioso é que se eu minimizar a tela e abrir logo em seguida o valor é atualizado. Ou seja, só está atualizando quando eu minimizo o frame. O que vocês acham que pode ser?

public boolean receiveMsg(Mensagem mensagem) {
                pressao = mensagem.getResposta();
                invalidate();
                validate();
                repaint();
                return true;
    }
    @Override
    public void paint(Graphics g) {
        g1 = (Graphics2D) g.create();

        atualiza();
    }

    private void atualiza(){
        g1.clearRect(...);
        
        g1.setClip(...);
        
        g1.setPaint(...);
        g1.setFont(...);
        g1.drawString(...);

        g1.setPaint(...);
        g1.setClip(...);
        g1.fill(...);
        g1.setPaint(...);
        g1.fillRect(...);
        g1.drawImage(...);
        g1.setPaint(...);
        g1.drawString(...);
        g1.setStroke(...);
        g1.draw(...);
    }

6 Respostas

ViniGodoy

Faltou chamar g1.dispose() na linha 13 (logo após atualiza()).

E para que a tela seja atualizada constantemente, é importante que seu processamento esteja fora da thread do Swing. Você critou outra thread para seu processamento, ou está tratando tudo na ação do botão?

Para repintar a tela, basta chamar repaint() mesmo. Mas é importante que a Thread do Swing esteja livre.

V

Cara, inseri o dispose e não resolveu.

Estou chamando o repaint a partir da função receiveMsg. Essa função é um listener que de 1 em 1 segundo eu recebo uma mensagem nova com um valor diferente.
Quando você fala que precisa liberar a thread do swing, é justamente esse comando de dispose certo?
Tentei o comando de finalize tbm e sem sucesso!

V

Xará, resolvi o meu problema.
Precisei incluir uma alteração em outro código que não foi postado.
Obrigado pela atenção.

ViniGodoy

Não, a solução é criar outra thread mesmo.

O dispose() só serve para liberar os recursos que o contexto gráfico utiliza, tais como as matrizes de transformação, que são armazenas no OpenGL ou DirectX.

leoviniga

Pode não ser “elegante” mas tenta dar um NomeDoFrame.setvisible(true); aonde você quer que ele atualize(mesmo que ele já esteja visível)…eu tava com um problema parecido e resolveu com isso :wink:

ViniGodoy

POG Warning: Programação por tentativa e erro sem entender o que ocorre detected.

99% dos códigos extremamente bugados, instáveis e que devem ser jogados no lixo são devido a práticas como essa.

Criado 6 de janeiro de 2011
Ultima resposta 6 de jan. de 2011
Respostas 6
Participantes 3