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!!!
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP