Tenho que mudar um text de um button em javafx atravez de um timer. Criei um classe Contador assim:
import tela.TelaController;
import java.util.Timer;
import java.util.TimerTask;
public class Contador {
Timer timer;
public Contador(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
@Override
public void run() {
TelaController limpar = new TelaController();
limpar.limpaBtnMensagem();
timer.cancel();
}
}
}
Para abrir o timer faço new Contador(10);
depois de 10 segundos abri o contador mas não executa a mudança do text do botão
retorna erro dizendo que o valor é null .
ajude me a mudar esse text do botão com um timer por favor! O que estou fazendo de errado?
desde ja agradeço.
Exception in thread “Timer-0” java.lang.NullPointerException: Cannot invoke “javafx.scene.control.Button.setText(String)” because “this.btnMensagem” is null
at controles.TelaLoginController.limparBtnMensagem(TelaController.java:112)
at contador.Contador$RemindTask.run(Contador.java:19)
at java.base/java.util.TimerThread.mainLoop(Timer.java:556)
at java.base/java.util.TimerThread.run(Timer.java:506)
esse erro
Posta o código da classe TelaLoginController.
O campo btnMensagem tá null
manda uma foto do erro por favor
e se possível da estrutura por foto
//Classe main inicial do projeto
package classes;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
public class Botao extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("/telas/Botao.fxml"));//carrega fxml
Scene scene = new Scene(root); //coloca o fxml em uma cena
stage.setResizable(false); //desabilita maximizar
stage.getIcons().add(new Image("imagens/cadeado.png")); //carrega imagem e muda o icone padrão da tela login
stage.setTitle("Teste de botão versão"); //Coloca o titulo na janela
stage.setScene(scene); //coloca a sena em uma janela
stage.show(); // abre a janela
}
}
//Classe controler
package controles;
import contador.Contador;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
public class BotaoController implements Initializable {
@FXML private Button btnSair;
@FXML private Button btnMensagem;
@FXML
private void clicouBotaoSair(ActionEvent event) {
System.exit(0);
}
@Override
public void initialize(URL url, ResourceBundle rb) {
new Contador(10);
}
public void limparBotaoMensagem(){
btnMensagem.setText("");
}
}
//Classe Views tela fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.Cursor?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
//Calsse timer
package contador;
import controles.BotaoController;
import java.util.Timer;
import java.util.TimerTask;
public class Contador {
Timer timer;
public Contador(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
@Override
public void run() {
BotaoController limpar = new BotaoController();
limpar.limparBotaoMensagem();
timer.cancel();
}
}
}
veja se alguém pode me ajudar por favor.
Tente com essa classe Contador:
package contador;
import controles.BotaoController;
import java.util.Timer;
import java.util.TimerTask;
public class Contador {
Timer timer;
BotaoController limpar;
public Contador(int seconds, BotaoController controller) {
limpar = controller;
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
@Override
public void run() {
limpar.limparBotaoMensagem();
timer.cancel();
}
}
}```
Como vou chamar essa classe?
a anterior faria assim:
new Contato(10);
depois de 10 segundos ela executa o método run()
new Contador(10, btnMensagem);
Foi a primeira coisa que fiz mas da erro.
new Contador(10, btnMensagem);
new Contador(10, btnMensagem());
new Contador(10, btnMensagem(""));
Todos dando erro.
Não deu certo.
Tem outro jeito de chamar esse contador.
desde já obrigado pela ajuda.
Exception in thread “JavaFX Application Thread” java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1862)
at javafx.fxml/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1729)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics/javafx.scene.Node.fireEvent(Node.java:8889)
at javafx.controls/javafx.scene.control.Button.fire(Button.java:203)
at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:208)
at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:247)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3856)
at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1851)
at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2584)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:409)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:299)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:447)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:412)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:446)
at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
at java.base/java.lang.Thread.run(Thread.java:831)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:76)
at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:273)
at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:83)
at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1857)
… 46 more
Caused by: java.lang.RuntimeException: Uncompilable source code - Erroneous ctor sym type: br.com.kimsoftwares.contador.Contador.
at br.com.kimsoftwares.controles.TelaLoginController.clicouBotaoLogin(TelaLoginController.java:40)
… 57 more
Você está usando NetBeans?
Esse último erro parece ser um bug do NetBeans.
Faça assim:
Abra as propriedades do projeto
Build-Compiling
Desmarque Compile on save / Compilar ao salvar
continua o mesmo erro.
você chegou a testar o codigo ai?
Não testei.
Mas esse último erro não tem relação com o código.
E se pesquisar no Google ele aponta pra um bug no NetBeans.
Tente executar o projeto com Clean and build.