当前位置: 首页 > 知识库问答 >
问题:

JavaFX:为WebEngine/WebView设置默认打印机

孟华晖
2023-03-14

我正在处理一个JavaFX项目,其中有一堆静态HTML&JS页面,我正在加载index.html,用户可以签出并单击链接等。

现在,通常当我们使用FirefoxChromium之类的浏览器时,调用print命令完成打印任务。

但在WebView中发生的情况不一样。我如何在JavaFX的网页呈现机制中启用打印。

以下是我到目前为止的代码:

public class Main extends Application {

    private Scene scene;
    MyBrowser myBrowser;

    @Override
    public void start(Stage primaryStage) throws Exception{
        primaryStage.setTitle("Test web");
        Screen screen = Screen.getPrimary();
        myBrowser = new MyBrowser();
        scene = new Scene(myBrowser, 1080, 1920);
        myBrowser.setPrefSize(1080, 1920);
        Rectangle2D bounds = screen.getVisualBounds();
        primaryStage.setX(bounds.getMinX());
        primaryStage.setY(bounds.getMinY());
        scene.setRoot(myBrowser);
        primaryStage.setScene(scene);
        primaryStage.setMaximized(false);
        primaryStage.setFullScreen(true);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}


class MyBrowser extends Region {

    final String hellohtml = "hello.html";

    WebView webView = new WebView();
    WebEngine webEngine = webView.getEngine();

    public MyBrowser(){

        URL urlHello = getClass().getResource("hello.html");
        webEngine.load(urlHello.toExternalForm());
        webView.setPrefSize(1080, 1920);
        webView.getChildrenUnmodifiable().addListener(new ListChangeListener<Node>() {
            @Override public void onChanged(Change<? extends Node> change) {
                Set<Node> deadSeaScrolls = webView.lookupAll(".scroll-bar");
                for (Node scroll : deadSeaScrolls) {
                    scroll.setVisible(true);
                }
            }
        });
        getChildren().add(webView);
    }
}

任何建议或指示都会很好。谢谢你..:-)

共有1个答案

潘修为
2023-03-14

假设您在js中的页面中有这样的内容:

<script type="text/javascript">
  function printInJava() {
    ...
  }
</script>

以下是如何注册Java代码和JavaScript之间的桥梁:

WebEngine webEngine = webView.getEngine();
    webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
        @Override
        public void changed(ObservableValue<? extends State> ov, State t, State t1) {
            if (t1 == Worker.State.SUCCEEDED) {
                JSObject window = (JSObject) webEngine.executeScript("window");
                window.setMember("app", this);
            }
        }
    });

在同一个类中,您有希望从JavaScript触发的方法:

public void print() {
  print(webView);
}

方法print(Node)与此示例中的方法相同。但是,我必须承认,我实际上并没有尝试过这段代码,从它的外观来看,您可能会遇到一些缩放和打印多页的问题。

现在您可以简单地完成JavaScript:

function printInJava() {
  app.print(); // call out the Java print method defined on the register variable app
}
import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.concurrent.Worker;
import javafx.print.PageLayout;
import javafx.print.PageOrientation;
import javafx.print.Paper;
import javafx.print.Printer;
import javafx.print.PrinterJob;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.Region;
import javafx.scene.transform.Scale;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;

import java.net.URL;
import java.util.Set;

public class Main extends Application {

  private Scene scene;
  MyBrowser myBrowser;

  @Override
  public void start(Stage primaryStage) throws Exception{
    primaryStage.setTitle("Test web");

    myBrowser = new MyBrowser();
    scene = new Scene(myBrowser, 1080, 1920);

    primaryStage.setScene(scene);
    primaryStage.setFullScreen(true);
    primaryStage.show();

  }
  public static void main(String[] args) {
    launch(args);
  }
}


class MyBrowser extends Region {

  final String hellohtml = "index.html";

  WebView webView = new WebView();
  WebEngine webEngine = webView.getEngine();


  public MyBrowser(){

    URL urlHello = getClass().getResource(hellohtml);
    webEngine.load(urlHello.toExternalForm());
    webView.setPrefSize(1080, 1920);
    webView.getChildrenUnmodifiable().addListener(new ListChangeListener<Node>() {
      @Override public void onChanged(Change<? extends Node>
                                          change) {
        Set<Node> deadSeaScrolls = webView.lookupAll(".scroll-bar");
        for (Node scroll : deadSeaScrolls) {
          scroll.setVisible(true);
        }
      }
    });

  webEngine. getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
    if (newValue == Worker.State.SUCCEEDED) {
      JSObject window = (JSObject) webEngine.executeScript("window");
      window.setMember("app", this);
    }   });

    getChildren().add(webView);
  }

  /**
   * Callback function from the JavaScript code.
   */
  public void print() {
    print(webView);
  }

  /** Scales the node based on the standard letter, portrait paper to be printed.
   * @param node The scene node to be printed.
   */
  public void print(final Node node) {
    Printer printer = Printer.getDefaultPrinter();
    PageLayout pageLayout = printer.createPageLayout(Paper.NA_LETTER, PageOrientation.PORTRAIT, Printer.MarginType.DEFAULT);
    double scaleX = pageLayout.getPrintableWidth() / node.getBoundsInParent().getWidth();
    double scaleY = pageLayout.getPrintableHeight() / 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();
      }
    }
  }
}
    null
 类似资料:
  • 我尝试在A4纸上以横向打印JavaFX WebView (JavaFX 8_25)中的HTML页面,但它以纵向打印出来,字体很小 系统输出显示纵向方向 纸张=纸:A4 (210 x 297mm) 尺寸=594.90087890625x841.3598022460938 MM 东方=纵向左边缘=54.0 右边缘=54.0 顶部边缘=54.0 底部边缘=54.0 我发现以横向模式打印HTML页面的唯一

  • 如何为每个WebView实例设置代理? 这是我到目前为止所拥有的: 这会启动一个带有谷歌页面的窗口。 但是如何设置代理?不是VM系统代理,而是每个WebView窗口的代理。

  • 我注意到,当我在JVM 7和JVM 8上运行JavaFX应用程序时,我得到了不同的默认外观。如何将每个JVM上的默认皮肤设置为相同?

  • 问题内容: 我正在开发应用程序,需要在应用程序的WebView / WebEngine部分上运行调试器,以便更好地调试应用程序。但是由于某种原因,我在互联网上发现的用于注入Firebug Lite的代码无法正常工作。 如果我在Firefox控制台上运行Javascript代码,则它本身可以正常运行,但是当通过JavaFX webview / webengine执行相同的代码时,JavaScript

  • Apache Kafka文档说明: 内部Kafka Streams使用者max.poll.interval.ms默认值已从300000更改为integer.max_value

  • 我成功地通过Apache POI生成了一个Excel文件。问题是,当我试图打印它时,最后3列不在可打印区域内。例如,工作表有列A到L,但打印时只适合列A到。用户总是在打印前将打印缩放从“不缩放”改为“将所有列放在一页上”。 我如何修改Excel文件,使所有列都适合可打印区域,并且用户不需要每次打印时都更改缩放。