我正在使用某个应用程序,该应用程序是在javafx中进行的,在此应用程序中我们正在接受食物订单,并且此订单我们必须使用其他打印机进行打印,有些打印机将在总公司的厨房中使用。在我的系统中,我需要打印机列表,并且当我从应用程序中按打印按钮时,我将从列表中选择打印机。因此打印作业将传递给所选的打印机。我将如何在javafx应用程序中完成此操作?
我正在使用以下方法,但是它将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(); } } }
ChoiceDialog为此,您可以使用a Printer从以下Set打印机返回的打印机中进行选择Printer.getAllPrinters:
ChoiceDialog
Printer
Set
Printer.getAllPrinters
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 ... }
当然,如果您不想使用对话框,也可以使用任何其他方式从项目列表中选择一个项目。例如
ListView
ComboBox
TableView
顺便说一句:除非进行布局,否则节点的大小将为0,这可能会导致
double scaleX = node.getBoundsInParent().getWidth(); double scaleY = node.getBoundsInParent().getHeight(); node.getTransforms().add(new Scale(scaleX, scaleY));
缩放到0。对于尚未显示的节点,您需要自己进行布局(请参见以下答案http://codingdict.com/questions/159525):
0
Group g = new Group(node); Scene scene = new Scene(g); g.applyCss(); g.layout(); double scaleX = node.getBoundsInParent().getWidth(); double scaleY = node.getBoundsInParent().getHeight();
但是无论如何,我不确定您要通过缩放实现什么目标……节点越大,缩放因子越大,这并不是一件真正合理的事情,尤其是在高度和宽度不同的情况下。