实时更新ListView JavaFX

时间:2015-11-09 17:19:20

标签: java multithreading javafx javafx-8

我上课了:

public class Friends implements Runnable{
private ObservableList<String> friendsList;

public Friends() {
    this.friendsList = FXCollections.observableArrayList();
}

public ObservableList<String> getList(){
    return friendsList;
}
public void start(){
     //run thread here
}
@Override
public void run() {
    //update friendList here
}

}

在控制器中我写这个:

Friends vf = new Friends();
ListView_1.setItems(vf.getList());
vf.start();

每秒后ListView更新,但我有这样的异常: 线程“Thread-5”中的异常java.lang.IllegalStateException:不在FX应用程序线程上; currentThread = Thread-5。 .....

阅读完手册之后,我明白我们需要在FX线程中刷新UI。我使用过Platform.runLater(),但是在流结束时UI正在变慢。

抱歉我的英语不好。

2 个答案:

答案 0 :(得分:1)

很可能你的Friends.run在一个单独的线程上运行并在那里更新了friendsList。但这是不允许的。您必须使用package com.dunkul.stateless; import javax.ejb.Stateless; import com.dunkul.entity.Book; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; @Stateless public class LibraryPersistentBean implements LibraryPersistentBeanRemote { public LibraryPersistentBean(){ } @PersistenceContext(unitName="EjbComponentPU") private EntityManager entityManager; public void addBook(Book book) { entityManager.persist(book); } public List<Book> getBooks() { return entityManager.createQuery("From Book").getResultList(); } } //--------------------------------------------------------------------- package com.dunkul.stateless; import javax.ejb.Remote; import com.dunkul.entity.Book; import java.util.List; @Remote public interface LibraryPersistentBeanRemote { void addBook(Book bookName); List<Book> getBooks(); } //---------------------------------------------------------- 更新FX应用程序线程上的friendList。

您可以在后台线程中构建newValue,但设置friendsList必须在FX应用程序线程上完成。

答案 1 :(得分:0)

首先创建一个执行朋友列表更新的任务类

public class UpdateFriendsTask extends Task<Void>{ 

    public ObjectProperty<ObservableList<String>> friendsProperty = new SimpleObjectProperty<>();
    public ObservableList<String> friendsList;

    public UpdateFriendsTask (ObservableList<String> friendsList) {

           this.friendsList = friendsList;
           friendsProperty.setValue(friendsList);

    }

    @Override
    public Void call () throws Exception {

        // parallel task to update friends list
        // friendsList.add(...) ....
        // friendsProperty.setValue(friendsList);
        // maybe fetching from a datasource or web service

    }
}

并将以下代码添加到主代码

// create a list of friends
ObservableList<String> friends = FXCollections.observableArrayList("John", "....");
//create listview to contain friends
ListView listView = new ListView();
// create instance of UpdateFriendsTask to update friends 
UpdateFriendsTask friendsUpdateTask = UpdateFriendsTask(friends);
// bind friendsProperty to listView items property
listView.itemsProperty().bind(friendsUpdateTask.friendsProperty);

friendsUpdateTask.start();