在TableView JavaFX

时间:2016-04-12 05:29:55

标签: javafx javafx-8

因此,如果用户选择与当前选择的行不同的行

,则代码可以正常工作
table.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> {
                if (newValue == null) {
                    updateDetails(oldValue);
                    return;
                }
                updateDetails(newValue);
            });
}

但是,如果用户同时点击相同的值,我希望这可以工作 - 基本上,有一部分代码修改了显示的图像,但该图像不会自动更新,除非我点击另一行然后去回到我以前的那一行。我希望能够通过点击它(它会调用updateDetails)来更新我所在的行,但似乎无法解决这个问题......

1 个答案:

答案 0 :(得分:1)

创建自定义rowFactory并为其添加鼠标侦听器。

实施例

这会显示上次点击的项目的旧值属性,并点击新项目作为Label的文字。

TableView<Item> tv = new TableView<>(FXCollections.observableArrayList(new Item("foo"), new Item("bar"), new Item("42")));

Label label = new Label();

TableColumn<Item, String> valueColumn = new TableColumn<>("value");
valueColumn.setCellValueFactory(d -> d.getValue().valueProperty());
tv.getColumns().add(valueColumn);

EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() {

    private Item lastItem;

    @Override
    public void handle(MouseEvent event) {
        if (event.getButton() == MouseButton.PRIMARY) {
            TableRow<Item> source = (TableRow<Item>) event.getSource();
            if (!source.isEmpty()) {
                label.setText(MessageFormat.format("old: {0}; new: {1}", lastItem == null ? null : lastItem.getValue(), (lastItem = source.getItem()).getValue()));
            }
        }
    }
};

tv.setRowFactory(t -> {
    TableRow<Item> row = new TableRow();
    row.setOnMouseClicked(eventHandler);

    return row;
});
public class Item {

    public Item() {
    }

    public Item(String value) {
        this.value.set(value);
    }

    private final StringProperty value = new SimpleStringProperty();

    public String getValue() {
        return value.get();
    }

    public void setValue(String val) {
        value.set(val);
    }

    public StringProperty valueProperty() {
        return value;
    }

}