小编典典

如何将打印作业传递给javafx应用程序中的特定打印机?

java

我正在使用某个应用程序,该应用程序是在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();
                    }
                }
            }

阅读 367

收藏
2020-11-30

共1个答案

小编典典

ChoiceDialog为此,您可以使用a
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):

Group g = new Group(node);
Scene scene = new Scene(g);
g.applyCss();
g.layout();
double scaleX = node.getBoundsInParent().getWidth();
double scaleY = node.getBoundsInParent().getHeight();

但是无论如何,我不确定您要通过缩放实现什么目标……节点越大,缩放因子越大,这并不是一件真正合理的事情,尤其是在高度和宽度不同的情况下。

2020-11-30