Как создать Javafx TableView на основе файла excel [duplicate]

В Java передаются только ссылки и передаются по значению:

Все аргументы Java передаются по значению (ссылка копируется при использовании метода):

В случай примитивных типов, поведение Java просто: значение копируется в другом экземпляре примитивного типа.

В случае объектов это одно и то же: переменные объекта являются указателями (ведрами), содержащими только адрес объекта который был создан с использованием «нового» ключевого слова и скопирован как примитивные типы.

Поведение может отличаться от примитивных типов: поскольку скопированная объектная переменная содержит один и тот же адрес (для одного и того же объекта) контент / члены могут по-прежнему модифицироваться в рамках метода и позже получать доступ снаружи, создавая иллюзию того, что сам объект (содержащий) был передан по ссылке.

Объекты «String» являются идеальным контр-примером для городской легенды, говорящей, что «Объекты передаются по ссылке»:

По сути, в рамках метода вы никогда не будете , чтобы обновить значение строки, переданной как аргумент:

Объект String, содержит символы массивом, объявленным окончательным, который не может быть изменен. Только адрес объекта может быть заменен другим, используя «новый». Использование «нового» для обновления переменной не позволит объекту получить доступ извне, поскольку переменная была первоначально передана по значению и скопирована.

6
задан fabian 1 June 2016 в 07:35
поделиться

1 ответ

То, что вам не хватает, - это cellValueFactory для ваших столбцов, которые будут сообщать столбцу, какое значение будет отображаться в его ячейках.

Что-то вроде этого:

TableView<ObservableList<String>> tableView = new TableView<>();
List<String> columnNames = dataGenerator.getNext(N_COLS);
for (int i = 0; i < columnNames.size(); i++) {
    final int finalIdx = i;
    TableColumn<ObservableList<String>, String> column = new TableColumn<>(
            columnNames.get(i)
    );
    column.setCellValueFactory(param ->
            new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))
    );
    tableView.getColumns().add(column);
}

Пример приложения

Это решение было немного основано на сообщении блога Narayan: Обновлено: Динамические данные TableView из базы данных . Вместо этого сообщения в блоге это решение использует генератор тестовых данных для генерации некоторых фиктивных данных и некоторых функций лямбда Java 8, которые делают заводское определение значения ячейки немного менее громоздким для записи и просмотра.

import javafx.application.Application;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;

import java.util.*;

public class DynamicTableView extends Application {    
    private static final int N_COLS = 5;
    private static final int N_ROWS = 1_000;

    public void start(Stage stage) throws Exception {
        TestDataGenerator dataGenerator = new TestDataGenerator();

        TableView<ObservableList<String>> tableView = new TableView<>();

        // add columns
        List<String> columnNames = dataGenerator.getNext(N_COLS);
        for (int i = 0; i < columnNames.size(); i++) {
            final int finalIdx = i;
            TableColumn<ObservableList<String>, String> column = new TableColumn<>(
                    columnNames.get(i)
            );
            column.setCellValueFactory(param ->
                    new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))
            );
            tableView.getColumns().add(column);
        }

        // add data
        for (int i = 0; i < N_ROWS; i++) {
            tableView.getItems().add(
                    FXCollections.observableArrayList(
                            dataGenerator.getNext(N_COLS)
                    )
            );
        }

        tableView.setPrefHeight(200);

        Scene scene = new Scene(tableView);
        stage.setScene(scene);
        stage.show();
    }

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

    private static class TestDataGenerator {
        private static final String[] LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tempus cursus diam ac blandit. Ut ultrices lacus et mattis laoreet. Morbi vehicula tincidunt eros lobortis varius. Nam quis tortor commodo, vehicula ante vitae, sagittis enim. Vivamus mollis placerat leo non pellentesque. Nam blandit, odio quis facilisis posuere, mauris elit tincidunt ante, ut eleifend augue neque dictum diam. Curabitur sed lacus eget dolor laoreet cursus ut cursus elit. Phasellus quis interdum lorem, eget efficitur enim. Curabitur commodo, est ut scelerisque aliquet, urna velit tincidunt massa, tristique varius mi neque et velit. In condimentum quis nisi et ultricies. Nunc posuere felis a velit dictum suscipit ac non nisl. Pellentesque eleifend, purus vel consequat facilisis, sapien lacus rutrum eros, quis finibus lacus magna eget est. Nullam eros nisl, sodales et luctus at, lobortis at sem.".split(" ");

        private int curWord = 0;

        List<String> getNext(int nWords) {
            List<String> words = new ArrayList<>();

            for (int i = 0; i < nWords; i++) {
                if (curWord == Integer.MAX_VALUE) {
                    curWord = 0;
                }

                words.add(LOREM[curWord % LOREM.length]);
                curWord++;
            }

            return words;
        }
    }
}
13
ответ дан jewelsea 25 August 2018 в 11:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: