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.
J
JoaoVitor
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 ^^
S
staroski1 like
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.
Aqui é onde eu queria fazer meu método de atualizar:
publicstaticvoidatualizaPainelPrincipal(){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.
publicvoidabaixaStatus(){//esse metodo acontece de tempo em tempo, conforme um timerintStatusAtual=GerenciaArquivos_Interacao.getInstance().getStatusArquivo();intStatusMod=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 ^^
J
JoaoVitor
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…
S
staroski1 like
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.
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
S
staroski1 like
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.
J
JoaoVitor
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.
J
JoaoVitor
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…
S
staroski
Se criou a classe centralizadora, ficará algo mais ou menos assim: