我有一张用作收据的表格(TableView)。该表由3列组成,分别是产品,总价和付款方式。 在产品列中,我有一个arraylist,其中包含每个产品的名称,每个产品的价格和每个产品的编号。 当用户从DatePicker中选择特定日期并单击“显示今天的销售”按钮时,表格将显示该特定日期的销售。
问题是整个Arraylist都打印在单元格中的一行中,但是假设必须将arraylist中的每个索引打印在一行中(包含产品名称,产品价格和产品编号)。
我知道有些问题看起来很相似,但是不同的是,在这种情况下,我想在单元格中插入整个arraylist,并且应该将其打印在多行上。这个特定问题尚未得到解答。
到目前为止,这是我的代码:
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();
}
}
}
任何帮助将不胜感激-预先感谢!
答案 0 :(得分:1)
根据 name_price_number 是一个字符串数组,您可以替换 这行:
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返回