Executar tarefa com temporizador

17 respostas
java
A
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.

17 Respostas

R

Poste o erro.

A
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
R

Posta o código da classe TelaLoginController.
O campo btnMensagem tá null

R

manda uma foto do erro por favor

R

e se possível da estrutura por foto

A

//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.

R

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

}```
A
Como vou chamar essa classe?

a anterior faria assim:

new Contato(10);

depois de 10 segundos ela executa o método run()
R

new Contador(10, btnMensagem);

A
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  obrigado pela ajuda.
R

Qual erro deu aqui?

A
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
R

Você está usando NetBeans?

A

sim netbeans 12.3

R

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

A

continua o mesmo erro.
você chegou a testar o codigo ai?

R

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.

Criado 21 de março de 2021
Ultima resposta 22 de mar. de 2021
Respostas 17
Participantes 3