Как показать многострочную ячейку в табличном представлении в javafx? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть таблица (TableView), которая действует как квитанция.Таблица состоит из 3 столбцов, продукта, общей цены и вида оплаты.В столбце продукта у меня есть arraylist, который содержит название каждого продукта, цену каждого продукта и номер каждого продукта.Когда пользователь выбирает определенную дату из DatePicker и нажимает кнопку «Показать сегодняшние продажи», в таблице будет показана продажа за этот конкретный день.

Проблема заключается в том, что весь Arraylist печатается в одной строкеячейка, но предполагается, что каждый индекс в массиве должен быть напечатан в строке (которая содержит название продукта, цену продукта и номер продукта).

Он должен выглядеть следующим образом: enter image description here

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

Вот мой код:

package gui;

import container.Container;
import controller.Controller;
import model.*;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.DatePicker;
import javafx.scene.layout.GridPane;

// this class extends GridPane because it is a Javafx tab
public class Todays_sales extends GridPane {


    Controller controller = Controller.getInstance();

    Container container = Container.getInstance();
    private DatePicker dpDate;
    private TableView<Sale> table = new TableView<>();
    private ObservableList<Sale> data;

    public Todays_sales () {

        setGridLinesVisible(false);
        setPadding(new Insets(20));
        setHgap(10);
        setVgap(10);

        // date
        dpDate = new DatePicker();
        this.add(dpDate, 0, 0);
        dpDate.setEditable(false);

        // button for today's sales
        Button btnShowTodaysSales = new Button("Show today's sales");
        this.add(btnShowTodaysSales , 0, 1);
        btnShowTodaysSales.setOnAction(event -> showTodaysSales_Action());

        // product
        TableColumn<Sale, String> productCol = new TableColumn<>("Product");
        productCol .setMinWidth(350);
        productCol .setCellValueFactory(new PropertyValueFactory<Sale, String>("name_price_number"));
        table.getColumns().add(productCol);

        // total price
        TableColumn<Sale, Integer> totalPriceCol = new TableColumn<>("Total price");
        totalPriceCol.setMinWidth(100);
        totalPriceCol.setCellValueFactory(new PropertyValueFactory<Sale, Integer>("totalprice"));
        table.getColumns().add(totalPriceCol);

        // type of payment
        TableColumn<Sale, String> paymentTypeCol = new TableColumn<>("Payment type");
        paymentTypeCol.setMinWidth(150);
        paymentTypeCol.setCellValueFactory(new PropertyValueFactory<Sale, String>("paymentType"));
        table.getColumns().add(paymentTypeCol);

        this.add(table, 0, 4);

    }

    private void showTodaysSales_Action() {
        if (dpDate.getValue() != null) {

            data = FXCollections.observableArrayList(controller.getTodaysSales(dpDate.getValue()));
            table.setItems(data);

        } else {
            Alert alert = new Alert(AlertType.INFORMATION);
            alert.setTitle("Today's sale");
            alert.setHeaderText("");
            alert.setContentText("A date must be selected");
            alert.show();
        }

    }

}

Буду признателен за любую помощь - заранее спасибо!

1 Ответ

0 голосов
/ 15 октября 2018

В соответствии с тем, что name_price_number является массивом String, вы уже можете просто заменить эту строку:

    productCol .setCellValueFactory(new PropertyValueFactory<Sale, String>("name_price_number"));

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

  productCol.setCellValueFactory(param -> {
        String result = String.join("\n",param.getValue().getName_price_number());
        return new SimpleStringProperty(result);
    });

На этой фабрике вы просто объединяете свой массив с новым разделителем строк и возвращаете как javaFX StringProperty

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...