簡體   English   中英

JavaFX TableView不更新?

[英]JavaFX TableView does not update?

我想用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;
}
}

我正在觀察hashmap的entrySet

不,您沒有觀察到任何東西。 實際上, HashMap不提供任何允許您觀察更改的功能。

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

只需創建一個新的ObservableList然后將作為參數傳遞的Collection的內容復制到此列表中。 在地圖中添加或刪除鍵之后,不再保證條目可以正常工作,但是如果地圖中的鍵發生更改,則不會有更新通知,並且ObservableList也不會更新。

我建議改用這些鍵作為TableView的項目,並在第一列的onEditCommit事件上更新地圖和項目列表。

@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();
}

請注意,上面的代碼僅在您不以其他方式修改地圖數據的情況下才有效。 如果您以其他方式修改地圖,則需要確保使keys列表保持最新狀態,並確保在修改值時調用table.refresh()

(在這種情況下,最好使用ObservableMap而不是HashMap ,后者允許您添加使列表保持更新的偵聽器。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM