Problemas ao atualizar JFrame

Olá, sou novo aqui no fórum e também na programação em Java.
Basicamente, eu tenho um JFrame que possui várias imagens, e uma delas é uma espécie de barra de status.
A imagem dessa barra muda cada vez que o status abaixa, por assim dizer.
Porém, eu preciso que essa imagem seja atualizada frequentemente, e o que está me causando dificuldades é que eu chamo o método de atualizar de uma outra classe.
Estou tentando com comandos tipo: this.repaint(), this.dispose() e etc, mas o eclipse aponta erro e diz que não posso usar this em um método estático, e como chamo ele de outra classe, ele precisa ser estático (pelo menos eu acho…).
Alguém pode me dar uma força sobre como atualizar um JFrame?

PS.: Já usei um new JFrame(), funcionou, porém foram sendo criados infinitos JFrames conforme atualizava. E não consegui fechar os anteriores pois precisava usar o this ;-;
(Não sei se o post está no lugar certo, ainda não entendi mto bem o funcionamento do site)…

Use a classe Timer.
Veja o vídeo a seguir, tem uma demonstração que usa esta classe.


Se puder assista desde a primeira aula, onde ele começa o jogo do 0.

1 curtida

Obrigado por responder,
basicamente, eu estou utilizando o mesmo principio dele, só que não consigo utilizar o repaint(); que ele usa… pq no meu caso estou tentando usar ele numa função estática. Estou tentando modificar aqui, obrigado ^^

Não deveria ser estático!
Você precisa de uma instância da classe, instância de classe é sinônimo de objeto.

Geralmente os programadores acham que precisam declarar um membro como estático pois costumam escrever código dessa forma:

NomeDaClasse.nomeDoMembro

Acontece que essa é a sintaxe para se invocar membros estáticos.

Para invocar membros de instância você usa:

nomeDoObjeto.nomeDoMembro

Posta o código das suas classes que fica fácil te orientar a ajustar o código.

1 curtida

Hm… Segue o código aqui:

public class TelaPrincipal extends JFrame{
    public TelaPrincipal(){
    		super();
            //O initialize faz as coisas como setar tamanho, colocar o JPanel e o setvisible(true);//
    		initialize();
    	}

Aqui é onde eu queria fazer meu método de atualizar:

public static void atualizaPainelPrincipal(){
		repaint();
           //this.dispose(); (nao funciona)
           //não consigo usar o this, nem o repaint aqui
	}

E aqui é de onde eu queria mandar atualizar, que está em outra classe.

public void abaixaStatus(){
//esse metodo acontece de tempo em tempo, conforme um timer
		int StatusAtual = GerenciaArquivos_Interacao.getInstance().getStatusArquivo();
		int StatusMod = StatusAtual-5;
		GerenciaArquivos_Interacao.getInstance().gravaStatusArquivo(StatusMod);
		GerenciaArquivos_Interacao.getInstance().modificaObjeto();
                //Depois das modificações, mandaria atualizar a tela por aqui//
                TelaPrincipal.atualizaPainelPrincipal();
	}

Obrigado por responder ^^

Tentei refazer como você disse, utilizando um objeto instanciado do meu JFrame na classe em que quero pedir a atualização.
Só que por eu estar criando uma nova instancia dele nessa outra classe, toda vez que ele atualiza, aparece um novo JFrame. E assim ele vai criando um novo JFrame a cada atualização…

Esse método não deve ser estático pois ele deve atualizar o seu objeto e não a classe.
Então, primeiro passo: tira fora o static.

Quem é que instancia essa classe?
Essa classe deveria ter uma referência à intância de sua TelaPrincipal.

Outra coisa, evite ficar chamando várias vezes o mesmo método desnecessariamente, ao invés disso, crie uma variável local, além de ser mais legível, é mais rápido.

Exemplo:

public void abaixaStatus(){
	GerenciaArquivos_Interacao gerenciador = GerenciaArquivos_Interacao.getInstance();
	int statusAtual = gerenciador.getStatusArquivo();
	int statusModificado = statusAtual - 5;
	gerenciador.gravaStatusArquivo(statusModificado);
	gerenciador.modificaObjeto();
	objetoDaTelaPrincipal.atualizaPainelPrincipal();
}
1 curtida

Consegui entender o conceito a ser aplicado, vou fazer isso mais nos códigos (Fui olhar e fiz essa de chamar o método sem criar uma variável local várias vezes…)
O problema agora é que, criando a variável local referenciando a tela principal, quando ocorre a chamada da atualização, um novo Frame aparece. Ou seja, ficam abrindo infinitos Frames…

Onde eu poderia fazer essa referência sem instanciar infinitos frames?

PS: A classe que chama a atualização é instanciada pela classe GerenciaArquivos_Interacao

Você pode passar a instância por parâmetro, mas o ideal seria você ter uma classe controladora pras suas telas.

Uma forma mais simples é centralizar o acesso às suas telas como eu sugeri pra um colega neste post aqui.

1 curtida

Obrigado, construí essa classe e organizei o código centralizando o acesso as telas. Pelo que percebi, agora só existe uma instância da tela principal durante todo o código ^^
Agora acredito que ficará mais fácil de tentar atualizar esse JFrame. Vou continuar buscando aqui alguma maneira de atualizá-lo.

Ainda não consegui fazer ele atualizar corretamente. Principalmente porque a aplicação se comporta de várias formas diferentes. Por exemplo, ela roda em segundo plano, e quando atualiza, ela volta a aparecer na tela. Ou então, simplesmente abre um JFrame a cada atualização. se alguém puder me dar uma ajuda sobre como atualizar a tela sem destruir a antiga e criar uma nova…

Se criou a classe centralizadora, ficará algo mais ou menos assim:

Telas.get().telaQueQueroAtualizar().metodoQueAtualiza();