我正在处理一个JavaFX项目,其中有一堆静态HTML&JS页面,我正在加载index.html
,用户可以签出并单击链接等。
现在,通常当我们使用Firefox
或Chromium
之类的浏览器时,调用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);
}
}
任何建议或指示都会很好。谢谢你..:-)
假设您在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();
}
}
}
}
我尝试在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文件,使所有列都适合可打印区域,并且用户不需要每次打印时都更改缩放。