TransWikia.com

Estou tentando fazer um programa de cronometro usando java FXML no scene builder e não consigo

Stack Overflow em Português Asked by Pedro de Araujo on December 2, 2021

Toda vez que clico no botão, na tentativa de iniciar o cronometro, esse erro acontece:

Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4

referindo-se a essa linha de código : `

lblMainChronometer.setText(String.format("%02d:%02d:%02d.%02d", hours, minutes, seconds, secondsHundredth));

Este é o FXMLDcumentControler do meu programa :

package chronometer;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

public class FXMLDocumentController implements Initializable {
    
    @FXML    
    private Label lblMainChronometer;

    private static int startTime;
    
    private void startCounter() { startTime = (int) System.currentTimeMillis(); }
    
    private static int currentTimeHundredth() {
        double currentTimeMillis;
        currentTimeMillis = startTime - System.currentTimeMillis();
        int currentTimeHundreth = (int) Math.floor(currentTimeMillis / 10);
        return currentTimeHundreth; 
    }
    
    private Runnable mainChronometer = new Runnable() {
        @Override
        public void run() {
            while (true) {
                
                int secondsHundredth = currentTimeHundredth() % 100;
                int currentTimeSeconds = currentTimeHundredth() - secondsHundredth;
                int seconds = (int) (currentTimeSeconds % 60);
                int minutes = (int) (currentTimeSeconds / 60);
                minutes %= 60; // to stay just the minutes (excluding the hours)           
                int hours = (int) (minutes / 60);
                lblMainChronometer.setText(String.format("%02d:%02d:%02d.%02d", hours, minutes, seconds, secondsHundredth));
                
            }
        }
    };
          
    @FXML
    private void handleButtonAction(ActionEvent event) throws InterruptedException {
        
        startCounter();
        new Thread(mainChronometer).start();
    }
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        
    }    
    
}

Me ajudem, por favor!!!

One Answer

Você esta tentando atualizar a thread do JavaFX usando uma outra Thread, isso não é possível. JavaFX só aceita coisas de dentro de sua própria thread.

Tente usar Platform.runLater() e passe como parâmetro um runnable com o comando para atualizar o valor no JavaFX.

Aconselho que pesquise sobre a classe Task em: docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html. pode ser que o método updateValue() lhe seja útil pois ele retorna resultados parciais, o que lhe serviria para atualizar as informações na tela. Neste link que te passei existe um exemplo de código que acho que vai lhe servir bem.

Exemplo:

public void handleClick() {
        // Verificar se esta thread já esta rodando.
        if (!isRunning) {
            Task<String> task = new Task<String>() {
                @Override
                protected String call() throws Exception {
                    isRunning = true;
                    String a = null;
                    for (int i = 0; i <= 60; i++) {
                        String finalA = String.valueOf(i);

                        //  Colocar a variável na sua label através da JavaFX Thread.
                        Platform.runLater(() -> {
                            label.setText(finalA);
                        });
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {

                        }
                    }
                    isRunning = false;
                    return a;
                }

            };
            new Thread(task).start();
        }
    }

Esta é uma forma que talvez funcione para seu caso.

Answered by Guifling on December 2, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP