首页 > 解决方案 > 爪哇外汇。使用 Pair 的 setCellValueFactory()

问题描述

我正在努力为 Table 列编写 setCellValueFactory() 。

HRSearchController.java

import java.util.List;

import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.util.Pair;

public class HRSearchController {
    private class AreaCell extends ListCell<Area> {
        @Override
        protected void updateItem(Area a, boolean flag) {
            super.updateItem(a, flag);
            this.setText(a == null ? "" : a.getPostal());
        }
    }

    @FXML
    private TextField input;

    @FXML
    private ListView<Area> list;

    @FXML
    private TableView<Pair<String, String>> table;

    @FXML
    private TableColumn<Pair<String, String>, String> key;

    @FXML
    private TableColumn<Pair<String, String>, String> value;

    @FXML
    void initialize() {
        list.setCellFactory(lv -> new AreaCell());
        list.getSelectionModel().selectedItemProperty().addListener((ob, oldSel, newSel) -> {
            });
    }

    @FXML
    void searchArea(ActionEvent event) {
        String key = input.getText();
        if (!key.isBlank()) {
            ObservableList<Area> model = list.getItems();
            Response result = HRjson.search(key);
            List<Area> location = result.getLocation();
            if (location != null) {
                model.clear();
                model.addAll(location);

            }
        }

    }

}

Area.java


import java.util.ArrayList;
import java.util.List;

import javafx.util.Pair;

public class Area {
    private String prefecture;
    private String city;
    private String town;
    private String city_kana;
    private String town_kana;
    private String x;
    private String y;
    private String postal;

    public String getPrefecture() {
        return prefecture;
    }

    public String getCity() {
        return city;
    }

    public String getTown() {
        return town;
    }

    public String getCity_kana() {
        return city_kana;
    }

    public String getTown_kana() {
        return town_kana;
    }

    public String getX() {
        return x;
    }

    public String getY() {
        return y;
    }

    public String getPostal() {
        return postal;
    }

    List<Pair<String, String>> getPairs() {
        List<Pair<String, String>> pairs = new ArrayList<>();
        pairs.add(new Pair<String, String>("郵便番号", postal));
        pairs.add(new Pair<String, String>("都道府県名&quot;, prefecture));
        pairs.add(new Pair<String, String>("市区名&quot;, city));
        pairs.add(new Pair<String, String>("市区名カナ&quot;, city_kana));
        pairs.add(new Pair<String, String>("町村名&quot;, town));
        pairs.add(new Pair<String, String>("町村名カナ&quot;, town_kana));
        pairs.add(new Pair<String, String>("経度", x));
        pairs.add(new Pair<String, String>("緯度", y));
        return pairs;

    };

    @Override
    public String toString() {
        return prefecture + " " + city + "  (" + city_kana + ") " + town + "  (" + town_kana + ") " + "x: " + x + " "
                + "y: " + y + " " + "〒 " + postal + "\n";
    }

}

我想让结果在键和值列中垂直显示。谁能帮助我如何在HRSearchController类中为 TableColumn 编写 setCellValueFactory ,然后在 TableView 中显示结果?

通常我使用 PropertyValueFactory 来设置值,但是对于 Pair case,我不知道该怎么做。

感谢您的时间。

标签: javajavafx

解决方案


您可以将值包装在可观察属性中并将其设置为单元值工厂。

TableView<Pair<String,String>> tableView = new TableView<>();
tableView.getItems().addAll(new Pair<>("A","Apple"),new Pair<>("B","Ball"),new Pair<>("C","Cat"));

TableColumn<Pair<String,String>, String> keyCol = new TableColumn<>("Key");
keyCol.setCellValueFactory(param -> new SimpleStringProperty(param.getValue().getKey()));

TableColumn<Pair<String,String>, String> valCol = new TableColumn<>("Value");
valCol.setCellValueFactory(param -> new SimpleStringProperty(param.getValue().getValue()));

tableView.getColumns().addAll(keyCol,valCol);

推荐阅读