我使用以下方法,但它将printjob传递给默认打印机,该打印机由系统选择,而不是由应用程序选择: -
public void print(Node node) {
Printer printer = Printer.getDefaultPrinter();
PageLayout pageLayout = printer.createPageLayout(Paper.NA_LETTER, PageOrientation.PORTRAIT, Printer.MarginType.DEFAULT);
double scaleX = node.getBoundsInParent().getWidth();
double scaleY = node.getBoundsInParent().getHeight();
node.getTransforms().add(new Scale(scaleX, scaleY));
PrinterJob job = PrinterJob.createPrinterJob();
if (job != null) {
boolean success = job.printPage(node);
if (success) {
job.endJob();
}
}
}
这是如何通过打印机打印作业,但不是从打印机打印出来的:
ChoiceDialog dialog = new ChoiceDialog(Printer.getDefaultPrinter(), Printer.getAllPrinters());
//ChoiceDialog dialog = new ChoiceDialog(printerName1, printerName2, printerName3, printerName4, printerName5);
dialog.setHeaderText("Choose the printer!");
dialog.setContentText("Choose a printer from available printers");
dialog.setTitle("Printer Choice");
Optional<Printer> opt = dialog.showAndWait();
if (opt.isPresent()) {
Printer printer = opt.get();
PrinterJob job = PrinterJob.createPrinterJob();
job.setPrinter(printer);
if (job != null) {
boolean success = job.printPage(node);
if (success) {
job.endJob();
}
}
}
答案 0 :(得分:1)
我知道这已经有4年的历史了,但是对于任何将来像我曾经一样找到解决方法的人来说,有一种更简单的方法来允许使用选择。只需使用方法.showPrintDialog(Stage stage)
(我试图将图像发布在底部链接的网站上,但是自从我刚建立起就没有足够的声誉)
我在下面放置了一些代码,供您参考如何使用它:
import javafx.print.PrinterJob;
import javafx.collections.ObservableSet;
import javafx.print.Printer;
import javafx.scene.Node;
import javafx.stage.Stage;
public class ExampleClass
{
public static void printPageSetup(Node node, Stage owner){
PrinterJob job = PrinterJob.createPrinterJob();
boolean proceed = job.showPrintDialog(owner);
boolean goforward = job.showPageSetupDialog(owner);
if (job == null){
return;
}
if (proceed && goforward){
print2(job, node);
}
}
public static void print2(PrinterJob job, Node node){
if (job != null){
boolean printed = job.printPage(node);
if (printed){
job.endJob();
}
}
else{
System.out.println("Printing failed");
}
}
}
使用这种方法的一个非常糟糕的例子是这样的方法:
// testPrint would just be attached to a random button of your own choice
public void testPrint(ActionEvent event) throws IOException{
Parent root = FXMLLoader.load(getClass().getResource("AN_EXAMPLE_FXML_PAGE.fxml"));
Scene scene = new Scene(root);
Stage stage = (Stage) ((Node)event.getSource()).getScene().getWindow();
ExampleClass.printPageSetup(root, stage);
}
有关更多信息,请访问javacodeforgeeks' article on this
答案 1 :(得分:0)
您可以使用ChoiceDialog
为此目的从Printer.getAllPrinters
返回的Printer
个打印机中选择Set
:
ChoiceDialog dialog = new ChoiceDialog(Printer.getDefaultPrinter(), Printer.getAllPrinters());
dialog.setHeaderText("Choose the printer!");
dialog.setContentText("Choose a printer from available printers");
dialog.setTitle("Printer Choice");
Optional<Printer> opt = dialog.showAndWait();
if (opt.isPresent()) {
Printer printer = opt.get();
// start printing ...
}
当然,如果您不想使用对话框,也可以使用任何其他方式从项目列表中选择单个项目。 E.g。
ListView
ComboBox
TableView
BTW:节点的大小将为0,除非它们是布局的,这可能会导致
double scaleX = node.getBoundsInParent().getWidth();
double scaleY = node.getBoundsInParent().getHeight();
node.getTransforms().add(new Scale(scaleX, scaleY));
将其缩放为0
。对于尚未显示的节点,您需要自己进行布局(请参阅此答案:https://stackoverflow.com/a/26152904/2991525):
Group g = new Group(node);
Scene scene = new Scene(g);
g.applyCss();
g.layout();
double scaleX = node.getBoundsInParent().getWidth();
double scaleY = node.getBoundsInParent().getHeight();
但是我不确定你想要通过缩放实现什么...节点越大,缩放因子就越不合理,特别是如果高度和宽度不同的话。