在 JavaFX 中打印 TableView 内容
Printing TableView Contents in JavaFX
我正在学习 JavaFX。我创建了 TableView
并用数据填充了它。我添加了一个按钮,当它被点击时,可以打印 table 内容。
这是 :
的完整代码
`public final class TableViewSample2 extends Application {
private TableView<Person> table;
private ObservableList<Person> list;
public void createTable() {
table = new TableView<>();
table.setEditable(true);
list = FXCollections.observableArrayList(
new Person("Jacob", "Smith", "jacob.smith@example.com"),
new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
new Person("Ethan", "Williams", "ethan.williams@example.com"),
new Person("Emma", "Jones", "emma.jones@example.com"),
new Person("Michael", "Brown", "michael.brown@example.com"));
//associating data with the table columns
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("name"));
TableColumn SurnameCol = new TableColumn("Surname");
SurnameCol.setMinWidth(100);
SurnameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("surname"));
TableColumn emailCol = new TableColumn("Emil");
emailCol.setMinWidth(100);
emailCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("email"));
table.setItems(list);
table.getColumns().addAll(firstNameCol, SurnameCol, emailCol);
}
@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 250);
this.createTable();
Label label = new Label("My Address Book");
Button button = new Button("Print");
//printing
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println(" can I print?");
PrinterJob printerJob = PrinterJob.createPrinterJob();
if (printerJob.showPrintDialog(primaryStage) && printerJob.printPage(table))
{
printerJob.endJob();
System.out.println("printed");
}
}
});
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table, button);
root.getChildren().add(vbox);
primaryStage.setTitle("Sample TableView");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}}
当我 运行 程序时,table 会按预期显示。完美的。但是,当我单击打印按钮时,什么也没有发生。当我看到这段代码时,我正在研究如何打印 TableView 内容。我试图在控制台中输出一些消息,但没有任何显示。
我该如何解决?
由于您已经在使用 primaryStage,它的所有者将是 null
尝试用 primaryStage
替换 primaeyStage.getOwner()
button.setOnAction((ActionEvent event) -> {
System.out.println(" can I print?");
PrinterJob printerJob = PrinterJob.createPrinterJob();
if (printerJob.showPrintDialog(primaryStage) && printerJob.printPage(table)) {
printerJob.endJob();
System.out.println("printed");
}
});
我复制了您的代码(以及来自 oracle 站点的 class Person
:),它运行良好。正如 ItachiUchiha 评论的那样,我还假设 .createPrinterJob() 不是 return 一个对象。可能你还没有安装打印机。
NetBeans 显示我的旧 HP 打印机的一些细节:
我正在学习 JavaFX。我创建了 TableView
并用数据填充了它。我添加了一个按钮,当它被点击时,可以打印 table 内容。
这是 :
的完整代码`public final class TableViewSample2 extends Application {
private TableView<Person> table;
private ObservableList<Person> list;
public void createTable() {
table = new TableView<>();
table.setEditable(true);
list = FXCollections.observableArrayList(
new Person("Jacob", "Smith", "jacob.smith@example.com"),
new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
new Person("Ethan", "Williams", "ethan.williams@example.com"),
new Person("Emma", "Jones", "emma.jones@example.com"),
new Person("Michael", "Brown", "michael.brown@example.com"));
//associating data with the table columns
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("name"));
TableColumn SurnameCol = new TableColumn("Surname");
SurnameCol.setMinWidth(100);
SurnameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("surname"));
TableColumn emailCol = new TableColumn("Emil");
emailCol.setMinWidth(100);
emailCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("email"));
table.setItems(list);
table.getColumns().addAll(firstNameCol, SurnameCol, emailCol);
}
@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 250);
this.createTable();
Label label = new Label("My Address Book");
Button button = new Button("Print");
//printing
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println(" can I print?");
PrinterJob printerJob = PrinterJob.createPrinterJob();
if (printerJob.showPrintDialog(primaryStage) && printerJob.printPage(table))
{
printerJob.endJob();
System.out.println("printed");
}
}
});
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table, button);
root.getChildren().add(vbox);
primaryStage.setTitle("Sample TableView");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}}
当我 运行 程序时,table 会按预期显示。完美的。但是,当我单击打印按钮时,什么也没有发生。当我看到这段代码时,我正在研究如何打印 TableView 内容。我试图在控制台中输出一些消息,但没有任何显示。
我该如何解决?
由于您已经在使用 primaryStage,它的所有者将是 null
尝试用 primaryStage
primaeyStage.getOwner()
button.setOnAction((ActionEvent event) -> {
System.out.println(" can I print?");
PrinterJob printerJob = PrinterJob.createPrinterJob();
if (printerJob.showPrintDialog(primaryStage) && printerJob.printPage(table)) {
printerJob.endJob();
System.out.println("printed");
}
});
我复制了您的代码(以及来自 oracle 站点的 class Person
:),它运行良好。正如 ItachiUchiha 评论的那样,我还假设 .createPrinterJob() 不是 return 一个对象。可能你还没有安装打印机。
NetBeans 显示我的旧 HP 打印机的一些细节: