gpt4 book ai didi

JavaFX TableView 不更新?

转载 作者:行者123 更新时间:2023-12-02 10:35:21 26 4
gpt4 key购买 nike

我想用tableView中新输入的编辑数据替换旧数据。column2有效,但column1无效。我发现entrySet()键改变了,但tableView中的键没有改变!我正在观察hashmap的entrySet,因此我希望当删除或添加条目时表会自动更新。这个假设错了吗?

import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.util.converter.IntegerStringConverter;

import java.util.Map;

public class EnumerateTable {
private ObservableList<Map.Entry<Integer, String>> items;


private TableView<Map.Entry<Integer,String>> table;
public EnumerateTable( Enumerator x) {







TableColumn<Map.Entry<Integer, String>, Integer> column1 = new TableColumn<>("Key");
column1.setCellValueFactory(p ->new SimpleIntegerProperty(p.getValue().getKey()).asObject());

TableColumn<Map.Entry<Integer, String>, String> column2 = new TableColumn<>("Value");
column2.setCellValueFactory(p -> new SimpleStringProperty(p.getValue().getValue()));

items = FXCollections.observableArrayList(x.enums.entrySet());



table = new TableView<>(items);
table.setEditable(true);
column1.setEditable(true);
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
table.getColumns().setAll(column1, column2);
column1.setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter()));
column1.setOnEditCommit(
t -> {
String value = t.getTableView().getItems().get(
t.getTablePosition().getRow()).getValue();
int key = t.getTableView().getItems().get(
t.getTablePosition().getRow()).getKey();
System.out.println(key+" key");
System.out.println(x.enums.entrySet()+" before");
x.getEnums().remove(key);
x.getEnums().put(t.getNewValue(),value);
System.out.println(t.getNewValue()+" new value");
System.out.println(x.getEnums().entrySet()+" after");
table.refresh();






});
column2.setCellFactory(TextFieldTableCell.forTableColumn());
column2.setOnEditCommit(
t -> {
int key= t.getTableView().getItems().get(t.getTablePosition().getRow()).getKey();

System.out.println(x.getEnums().size());
x.getEnums().put(key,t.getNewValue());
System.out.println(x.getEnums().size());
});


}



public TableView<Map.Entry<Integer, String>> getTable() {
return table;
}

}

getEnums()方法来自

import java.util.HashMap;

public class Enumerator {
String name;
HashMap<Integer,String> enums;


public Enumerator(String name)
{ this.name = name;
enums = new HashMap<>();}

public HashMap<Integer, String> getEnums() {
return enums;
}
}

最佳答案

I am observing the entrySet of hashmap

不,你没有观察到任何东西。事实上,HashMap 不提供任何允许您观察更改的功能。

FXCollections.observableArrayList(x.enums.entrySet());

只需创建一个新的 ObservableList 并将作为参数传递给此列表的 Collection 中的内容复制即可。从 map 中添加或删除键后,不再保证条目有效,但如果 map 中的键发生更改,则不会有更新通知,并且 ObservableList 也不会更新。

我建议使用键作为 TableView 的项目,并在第一列的 onEditCommit 事件上更新 map 和项目列表。

@Override
public void start(Stage primaryStage) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "foo");
map.put(23, "bar");

ObservableList<Integer> keys = FXCollections.observableArrayList(map.keySet());

TableView<Integer> table = new TableView<>(keys);

TableColumn<Integer, Integer> column1 = new TableColumn<>("Key");
column1.setCellValueFactory(p -> new SimpleObjectProperty<>(p.getValue()));

TableColumn<Integer, String> column2 = new TableColumn<>("Value");
column2.setCellValueFactory(p -> new SimpleStringProperty(map.get(p.getValue())));

table.setEditable(true);
column1.setEditable(true);
table.getColumns().setAll(column1, column2);

column1.setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter()));
column1.setOnEditCommit(t -> {
Integer key = t.getRowValue();
Integer newKey = t.getNewValue();
if (!key.equals(newKey)) {
if (map.containsKey(newKey)) {
// make sure this cell's value remains unmodified
table.refresh();
} else {
int rowIndex = t.getTablePosition().getRow();
map.put(newKey, map.remove(key));
keys.set(rowIndex, newKey);
}
}
});
column2.setCellFactory(TextFieldTableCell.forTableColumn());
column2.setOnEditCommit(t -> {
Integer key = t.getRowValue();
map.put(key, t.getNewValue());
});

Scene scene = new Scene(table);

primaryStage.setScene(scene);
primaryStage.show();
}

请注意,上述代码仅在您不以其他方式修改 map 数据的情况下才有效。如果您以其他方式修改 map ,则需要确保保持 keys 列表最新,并确保调用 table.refresh()(如果您修改)一个值。

(在这种情况下,最好使用 ObservableMap 而不是 HashMap,它允许您添加保持列表更新的监听器。)

关于JavaFX TableView 不更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53333724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com