Problema no refresh do frame

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(...);
    }

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.

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!

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

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.

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:

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.