我上课了:
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正在变慢。
抱歉我的英语不好。
答案 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();