我的计划并不像我想的那样工作。我写了一个名为" Uhr
"的类,这是一个简单的计时器。为了显示计时器,我还写了一个名为" UhrMain
"的类,它应该创建一个GUI。一切都很完美,但每当我的StringProperty
在课堂上发生变化时,我会得到一个" Uhr
" - 错误。所以标签没有更新。
要将时间绑定到标签,我使用了以下代码:
No Fx8 Application thread
我完全不知道为什么这不起作用。
Uhr.java:
timeLabel.textProperty().bind(eineUhr.zeitProperty());
MainTest.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package uhr;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
/**
*
* @author
*/
public class Uhr extends Thread{
private final StringProperty zeit;
private int mSec;
private int sec;
private boolean running;
public Uhr(){
zeit = new SimpleStringProperty();
running = false;
}
public final StringProperty zeitProperty(){
return zeit;
}
public final String getZeit(){
return zeit.get();
}
public synchronized void startTimer(){
this.running = true;
}
public synchronized void stopTimer(){
this.running = false;
}
@Override
public void run(){
while(true){
try {
Thread.sleep(100);
mSec++;
if(mSec >= 10){
mSec = 0;
sec++;
zeit.set("Zeit: " + sec);
System.out.println(zeit.get());
}
} catch (InterruptedException ex) {
Logger.getLogger(Uhr.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
我感谢任何帮助。
答案 0 :(得分:2)
您应该将set
个实例上的StringProperty
方法调用包装到Platform.runLater(Runnable runnable)
中,以确保通过JavaFX Application Thread
进行修改来防止此问题实际上调用set
会对你的用户界面产生直接影响,只有JavaFX Application Thread
允许修改你的用户界面,因为Java FX Components
不是线程安全的。
Platform.runLater(() -> zeit.set("Zeit: " + sec));
答案 1 :(得分:1)
应该更改此方法:
@Override
public void run(){
while(true){
try {
Thread.sleep(100);
mSec++;
if(mSec >= 10){
mSec = 0;
sec++;
Platform.runLater(()->zeit.set("Zeit: " + sec));
System.out.println(zeit.get());
}
} catch (InterruptedException ex) {
Logger.getLogger(Uhr.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
它为我修复了崩溃。
答案 2 :(得分:0)
我暂时没有使用过JavaFX,但我认为你只需要在正确的UI线程中运行任何与UI相关的东西(就像大多数UI框架一样,只有一个线程可以访问UI元素)。
Platform.runLater(new Runnable() {
@Override public void run() {
timeLabel.textProperty().bind(eineUhr.zeitProperty());
}
});