JavaFx,如何将ObservableMap插入TableView? [英] JavaFx, How to insert ObservableMap into TableView?

查看:67
本文介绍了JavaFx,如何将ObservableMap插入TableView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将地图值填充到tableview中.我尝试使用observableList及其工作正常.只要有任何值添加到列表中,表值就会被更新/刷新并显示新的更改.

I want to populate map values into tableview. I tried with observableList and its working fine. Whenever any value adds to list then table values are updates / refresh and shows new changes.

我也想对地图做同样的事情.每当我向映射表视图添加任何值时,都需要刷新,但不是必须刷新.我读了很多文章,但无法解决这个问题.

I want to do the same with map also. Whenever I adds any value to map table view needs to be refresh but it is not. I read so many articles but not able to solve this issue.

文章:

  1. 使用ObservableMap JavaFX填充TableView
  2. 如何通过JavaFX的TableView显示ObservableMap

我的Java代码.

@Component
@FxmlView
public class MapExample {

    private static int i = 0;

    @FXML
    private TableView<Map.Entry<String, Person>> tableview;

    private ObservableMap<String, Person> map = FXCollections.observableHashMap();

    @FXML
    public void initialize() {

        System.out.println("Map Example !!");

        map.put("Vijay", new Person("Rahul", "Kakade"));

        map.addListener((MapChangeListener<String, Person>) change -> {
            if (change.wasAdded()) {
                System.out.println("If part !!");
                map.forEach((k, v) -> System.out
                        .println("Key :" + k + " Name :" + v.getFirstName() + " Last :" + v.getLastName()));
            } else if (change.wasRemoved()) {
                System.out.println("Else part !!");
                map.forEach((k, v) -> System.out
                        .println("Key :" + k + " Name :" + v.getFirstName() + " Last :" + v.getLastName()));
            }
        });

        TableColumn<Map.Entry<String, Person>, String> col = new TableColumn<>("Name");
        col.setCellValueFactory(
                (TableColumn.CellDataFeatures<Map.Entry<String, Person>, String> p) -> new SimpleStringProperty(
                        p.getValue().getKey()));

        TableColumn<Map.Entry<String, Person>, String> col2 = new TableColumn<>("FirstName");
        col2.setCellValueFactory(
                (TableColumn.CellDataFeatures<Map.Entry<String, Person>, String> p) -> new SimpleStringProperty(
                        p.getValue().getValue().getFirstName()));

        TableColumn<Map.Entry<String, Person>, String> col3 = new TableColumn<>("LastName");
        col3.setCellValueFactory(
                (TableColumn.CellDataFeatures<Map.Entry<String, Person>, String> p) -> new SimpleStringProperty(
                        p.getValue().getValue().getLastName()));

        tableview.getColumns().add(col);
        tableview.getColumns().add(col2);
        tableview.getColumns().add(col3);

        tableview.setItems(FXCollections.observableArrayList(map.entrySet()));

        ExecutorService service = Executors.newSingleThreadExecutor();

        service.execute(() -> {

            while (true) {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                map.put("Vijay", new Person("Rahul" + i++, "Kakade" + i));

                System.out.println(map.size());

            }
        });

    }
}

人员模型:

public class Person {
    private String firstName = null;
    private String lastName = null;
    //getter and setter
}

我知道这里有一些小错误,但无法解决.请告诉我我哪里错了.

I know there is some small mistake but not able to solve it. Please tell me where I am wrong.

谢谢.

推荐答案

您可以通过这种方式尝试.但是不要忘记在FX线程中填充地图.

You can try in this way. But don't forget to populate map in FX thread.

@FXML 
private TableView<Map.Entry<? extends String,? extends Person>> table;

....

final ObservableMap<String, Person> map = FXCollections.observableHashMap();
final ObservableList<Map.Entry<? extends String, ? extends Person>> list=FXCollections.observableArrayList();

map.addListener((MapChangeListener<String, Person>) change -> list.setAll(change.getMap().entrySet()));

TableColumn<Map.Entry<? extends String,? extends Person>, String> col = new TableColumn<>("Name");

...        

table.setItems(list);

这篇关于JavaFx,如何将ObservableMap插入TableView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆