用字符串填充表格视图

2024-01-20

我已阅读 API 和示例,但无法理解如何填充表格视图。

假设我有一个两列字符串数组(String[][]),其中包含“名称,值”对。我现在只想创建一个表格视图,它在两列中显示数据,在第一列中显示原始数组中所有行的名称,在第二列中显示值。

我尝试了什么?什么都没有,但似乎您需要创建可观察列表,每一列一个,将其绑定到其各自的列,然后将该列添加到表视图中。但这在我见过的所有例子中都涉及“工厂”,这对我来说是一个陌生的概念。

我猜这很简单,但我无法理解它。请帮忙。


细胞价值工厂

对于表中的每一列,您设置/创建一个细胞价值工厂。每行都有一个对应的对象tableview.getItems()。为了确定该对象如何在列中显示,每列都使用自己的单元格值工厂。工厂接收对象并返回要显示的值。

Since String[][]是一个数组String[]的,我们希望工厂能够接受String[]并返回String对应于其列。

Example

以下是通过这种方式创建单元值工厂的示例。它有点冗长,但可以用 lambda 来清理! (参见 Lambda 部分)。

// ---------------------------------------Initialize the data
String[][] data = ...; // Get name/value pairs from somewhere

// ---------------------------------------Setup a TableView with two TableColumns 
    /* ... Code ... */

// ---------------------------------------Add Cell Value Factories
nameColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<String[], String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(TableColumn.CellDataFeatures<String[], String> p) {
        String[] x = p.getValue();
        if (x != null && x.length>0) {
            return new SimpleStringProperty(x[0]);
        } else {
            return new SimpleStringProperty("<no name>");
        }
    }
});

valueColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<String[], String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(TableColumn.CellDataFeatures<String[], String> p) {
        String[] x = p.getValue();
        if (x != null && x.length>1) {
            return new SimpleStringProperty(x[1]);
        } else {
            return new SimpleStringProperty("<no value>");
        }
    }
});

// ---------------------------------------Add Data to TableView
tableView.getItems().addAll(Arrays.asList(data));

Result

If you throw this example (via the Source Code), on a Stage, this is what you get. it works!

Lambdas

Java 有点冗长,尤其是在使用匿名类时。值得庆幸的是,有 lambda 表达式,它为 Java 带来了一点可读性。以下是示例中相同的单元格值工厂,用 lambda 重写。

nameColumn.setCellValueFactory((p)->{
        String[] x = p.getValue();
        return new SimpleStringProperty(x != null && x.length>0 ? x[0] : "<no name>");
});

valueColumn.setCellValueFactory((p)->{
        String[] x = p.getValue();
        return new SimpleStringProperty(x != null && x.length>1 ? x[1] : "<no value>");
});

源代码

这是一个以这种方式使用单元值工厂的独立 JavaFX 类。

import java.util.Arrays;
import java.util.List;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;

/**
 *
 * @author nonfrt
 */
public class TableStuff extends Application {

    @Override
    public void start(Stage primaryStage) {

        // Create the data structure
        String[][] data = new String[5][2];
        data[0] = new String[]{"Jon Skeet","876k"};
        data[1] = new String[]{"Darin Dimitrov","670k"};
        data[2] = new String[]{"BalusC","660k"};
        data[3] = new String[]{"Hans Passant","635k"};
        data[4] = new String[]{"Marc Gravell","610k"};

        // Create the table and columns
        TableView<String[]> tv = new TableView();
            TableColumn<String[],String> nameColumn = new TableColumn();
                nameColumn.setText("Name Column");

            TableColumn<String[],String> valueColumn = new TableColumn();
                valueColumn.setText("Value Column");
        tv.getColumns().addAll(nameColumn,valueColumn);

        // Add cell value factories
//        nameColumn.setCellValueFactory((p)->{
//                String[] x = p.getValue();
//                return new SimpleStringProperty(x != null && x.length>0 ? x[0] : "<no name>");
//        });
//
//        valueColumn.setCellValueFactory((p)->{
//                String[] x = p.getValue();
//                return new SimpleStringProperty(x != null && x.length>1 ? x[1] : "<no value>");
//        });
        nameColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<String[], String>, ObservableValue<String>>() {
            @Override
            public ObservableValue<String> call(TableColumn.CellDataFeatures<String[], String> p) {
                String[] x = p.getValue();
                if (x != null && x.length>0) {
                    return new SimpleStringProperty(x[0]);
                } else {
                    return new SimpleStringProperty("<no name>");
                }
            }
        });

        valueColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<String[], String>, ObservableValue<String>>() {
            @Override
            public ObservableValue<String> call(TableColumn.CellDataFeatures<String[], String> p) {
                String[] x = p.getValue();
                if (x != null && x.length>1) {
                    return new SimpleStringProperty(x[1]);
                } else {
                    return new SimpleStringProperty("<no value>");
                }
            }
        });

        // Add Data
        tv.getItems().addAll(Arrays.asList(data));

        // Finish setting the stage
        StackPane root = new StackPane();
        root.getChildren().add(tv);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Cell Value Factory Example");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}

[NOTE: The answer https://stackoverflow.com/a/10532093/4769802 to this https://stackoverflow.com/q/10519534/4769802其他 StackOverFlow 问题是另一个例子。]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用字符串填充表格视图 的相关文章

随机推荐