Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX,对TableView中显示的数据的操作_Java_Javafx_Javafx 8 - Fatal编程技术网

JavaFX,对TableView中显示的数据的操作

JavaFX,对TableView中显示的数据的操作,java,javafx,javafx-8,Java,Javafx,Javafx 8,当从数据库中读取数据以在ObservableList TableView中显示它们时,是否可能会转为迭代?在显示执行的每一行操作之前,我想先检查一下 1. operation on line 1 2. display line 1 in tableview 3. operation on line 2 4. display line 2 in tableview ... and so on. 一切都将在后台线程中发生(服务或任务?) 操作将搜索是否存在键并赋值 当在TableView中编辑数据

当从数据库中读取数据以在ObservableList TableView中显示它们时,是否可能会转为迭代?在显示执行的每一行操作之前,我想先检查一下

1. operation on line 1
2. display line 1 in tableview
3. operation on line 2
4. display line 2 in tableview
... and so on.
一切都将在后台线程中发生(服务或任务?) 操作将搜索是否存在键并赋值


当在TableView中编辑数据时,将加载所有内容时,是否可以仅替换线程中的一行以避免整个视图过载?我为您准备了一些代码,希望这就是您所需要的。 一般的想法是必须使用新线程和任务类。 在这里,您可以阅读更多关于此的信息:

public类主扩展应用程序{
private TableView table=new TableView();
ArrayList listPerson=new ArrayList();//此列表可以从数据库中填充
私有可观测列表数据;
公用干管(){
添加(新人员(“Ania”);
添加(新人员(“Kasia”);
添加(新的人(“莫妮卡”);
添加(新人员(“Jola”);
添加(新人员(“Ewa”);
数据=FXCollections.observableArrayList(listPerson);
}
公共静态void main(字符串[]args){
发射(args);
}
@覆盖公共无效开始(阶段)引发中断异常{
TableColumn firstNameCol=新的TableColumn(“名字”);
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(新属性ValueFactory(“firstName”));
table.getColumns().addAll(firstNameCol);
最终VBox VBox=新的VBox();
vbox.getChildren().addAll(表);
场景=新场景(vbox,400400);
舞台场景;
stage.show();
//使用新线程,您可以在其中继续数据并动态添加到TableVIew
任务=新任务(){
@Override protected Void call()引发异常{
for(个人:listPerson){
System.out.println(“对person做点什么:+person”);
已同步(此){
这个。等等(3000);
table.getItems().add(person);
System.out.println(person+“添加到表中。执行下一个\n”);
}
}
返回null;
}
};
线程th=新线程(任务);
th.setDaemon(true);
th.start();
}
公共阶层人士{
私有最终SimpleStringProperty名字;
公众人物(字符串fName){
this.firstName=新的SimpleStringProperty(fName);
}
公共字符串getFirstName(){
返回firstName.get();
}
public void setFirstName(字符串fName){
firstName.set(fName);
}
@重写公共字符串toString(){
返回firstName.getValue();
}
}
}
它的工作原理如下:


你问什么还不完全清楚。如果问题是是否可以显示一些数据,答案是肯定的-只需在准备就绪时将数据插入表的
items
属性。
tableView.setItems(data)通过这种方式,您可以添加要显示的数据。在这种情况下,您需要处理所有内容并仅显示。我想逐行处理和显示,而不是一次全部处理和显示。有可能吗?通过这种方式,我可以在后台平滑地编辑动态选择的行并加载数据,而无需使用锁定时间,而不是使用
setItems
,保持
items
列表不变,并且每当有新行数据时,都要执行
tableView.getItems().add(行)
我可以这样做吗?行将迭代地接受ObservableList的值,并显示tableView,只要它持续循环?当每一行都是stowrzony时,是否可能有一个新线程?当您将所有内容都放在一个文件中时,即使加载大量行,也需要一点时间。而不是它的结尾在后台运行。直到你加载它所有的闪烁。单元格是可编辑的,不需要等待加载所有数据就可以轻松编辑。我不知道您到底想要什么。要在新线程中加载每一行吗?当数据加载时,您想同时编辑它们吗?在我的示例中,我添加了wait(3000),它工作得很慢,但通常速度很快,在打开ViewTable之后,所有内容都将可见,加载也将完成。我不知道如何与你联系,也许用波兰语会更好;)
public class Main extends Application {
  private TableView<Person> table = new TableView<Person>();
  ArrayList<Person> listPerson = new ArrayList<>(); //this list can be filled from database
  private ObservableList<Person> data;

  public Main() {
    listPerson.add(new Person("Ania"));
    listPerson.add(new Person("Kasia"));
    listPerson.add(new Person("Monika"));
    listPerson.add(new Person("Jola"));
    listPerson.add(new Person("Ewa"));
    data = FXCollections.observableArrayList(listPerson);
  }


  public static void main(String[] args) {
    launch(args);
  }

  @Override public void start(Stage stage) throws InterruptedException {

    TableColumn firstNameCol = new TableColumn("First Name");
    firstNameCol.setMinWidth(100);
    firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
    table.getColumns().addAll(firstNameCol);

    final VBox vbox = new VBox();
    vbox.getChildren().addAll(table);
    Scene scene = new Scene(vbox, 400, 400);
    stage.setScene(scene);
    stage.show();

    //Use new thread where you can proceed your data and add dynamically to the TableVIew
    Task<Void> task = new Task<Void>() {
      @Override protected Void call() throws Exception {
        for (Person person : listPerson) {
          System.out.println("Do something with person: " + person);
          synchronized (this) {
            this.wait(3000);
            table.getItems().add(person);
            System.out.println(person + " added to table. Do the next one \n");
          }
        }
        return null;
      }
    };

    Thread th = new Thread(task);
    th.setDaemon(true);
    th.start();
  }

  public class Person {
    private final SimpleStringProperty firstName;

    public Person(String fName) {
      this.firstName = new SimpleStringProperty(fName);
    }

    public String getFirstName() {
      return firstName.get();
    }

    public void setFirstName(String fName) {
      firstName.set(fName);
    }

    @Override public String toString() {
      return firstName.getValue();
    }
  }
}