JavaFx8属性绑定导致"没有Fx8应用程序线程"

时间:2017-01-24 14:54:22

标签: java multithreading javafx-8

我的计划并不像我想的那样工作。我写了一个名为" 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);
            }

        }
    }

}

我感谢任何帮助。

3 个答案:

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