it-swarm.com.ru

Простой способ добавить данные в столбцы

Я хочу вставить два отдельных набора данных в столбцы в JavaFX TableView. В основном у меня есть 2 LinkedLists со строками, и я хочу поместить один список в один столбец, а другой - во второй.

Какой самый простой способ сделать это? Или другой элемент JavaFX лучше для этого?

Только решения, которые я нашел до сих пор, основывались на коллекциях, которые были вставлены в строки, что я не хочу делать.

5
tikend

Я настоятельно рекомендую реорганизовать ваши данные, чтобы у вас был класс с двумя свойствами, одно из которых является элементом из вашего первого списка, а другое - соответствующим элементом из вашего второго списка. Затем вы можете составить список объектов этого класса, и вы сведетесь к обычному случаю.

Например. Предположим, у вас есть

// your first list:
List<Integer> intList = ... ;
// your second list:
List<String> stringList = ... ;

Затем определите

public class MyDataType {
    private final int intValue ;
    private final String stringValue ;
    public MyDataType(int intValue, String stringValue) {
        this.intValue = intValue ;
        this.stringValue = stringValue ;
    }
    public int getIntValue() {
        return intValue ;
    }
    public String getStringValue() {
        return stringValue ;
    }
}

Теперь вы можете сделать

TableView<MyDataType> table = new TableView<>();
for (int i = 0; i < intList.size() && i < stringList.size(); i++) {
    table.getItems().add(new MyDataType(intList.get(i), stringList.get(i)));
}

и определите столбцы обычным способом.

Если вы действительно не можете выполнить такое преобразование данных по какой-либо причине, тогда вы можете рассматривать тип таблицы как целое число, причем значение для каждой строки является индексом в двух списках. Заполните таблицу значениями 0, 1,... до размера списков. Это выглядит так:

import Java.util.Arrays;
import Java.util.List;

import javafx.application.Application;
import javafx.beans.property.ReadOnlyIntegerWrapper;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class TableViewByColumns extends Application {

    @Override
    public void start(Stage primaryStage) {
        List<Integer> intValues = Arrays.asList(1, 2, 3, 4, 5);
        List<String> stringValues = Arrays.asList("One", "Two", "Three", "Four", "Five");

        TableView<Integer> table = new TableView<>();
        for (int i = 0; i < intValues.size() && i < stringValues.size(); i++) {
            table.getItems().add(i);
        }

        TableColumn<Integer, Number> intColumn = new TableColumn<>("Value");
        intColumn.setCellValueFactory(cellData -> {
            Integer rowIndex = cellData.getValue();
            return new ReadOnlyIntegerWrapper(intValues.get(rowIndex));
        });

        TableColumn<Integer, String> nameColumn = new TableColumn<>("Name");
        nameColumn.setCellValueFactory(cellData -> {
            Integer rowIndex = cellData.getValue();
            return new ReadOnlyStringWrapper(stringValues.get(rowIndex));
        });

        table.getColumns().add(intColumn);
        table.getColumns().add(nameColumn);

        primaryStage.setScene(new Scene(new BorderPane(table), 600, 600));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
9
James_D

Я нашел учебник по JavaFX, в котором, как представляется, есть решения для сбора коллекций и заполнения столбцов на их основе, а также для автоматического обновления таблицы при последующем изменении коллекций с использованием ObservableList.

http://code.makery.ch/library/javafx-8-tutorial/part2/

В их коде есть список объектов с двумя атрибутами, и вы захотите изменить их код так, чтобы он рисовал из ваших двух отдельных списков, а не для доступа к двум переменным их объектов для отдельных столбцов.

1
dbillz