2016-01-15 66 views
0

我正在开发一个JavaFX项目,其中有一堆静态HTML & JS页面,我正在加载用户可以检出并点击链接等的index.htmlJavaFX:为WebEngine/Webview设置默认打印机

现在,通常当我们使用类似FirefoxChromium的浏览器时,调用print命令将执行打印任务。

这是不是发生在webview发生的同样的事情。如何在JavaFX的网页渲染机制中启用打印。

还有一种方法可以调用打印函数并将它传递给JavaScript的网页或web视图。

这里是我到目前为止的代码:

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); 
    } 
} 

任何建议或指针将是很好。谢谢。:-)

+0

到这里看看:https://carlfx.wordpress.com/2013/07/15/introduction-by-example-javafx-8-printing/ – hotzst

+0

@hotzst:该应用程序是全屏显示,而且我不能添加额外的按钮。还有一种方法可以调用打印功能并将它传递给JavaScript中的网页或web视图。 –

+0

@hotzst:有什么想法? –

回答

1

假设你有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)this example相同。然而,我必须承认,我并没有真正尝试这些代码,从外观上看,你可能遇到一些缩放和打印多页的问题。

现在,你可以简单地完成的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(); 
     } 
    } 
    } 
} 

更多参考:

+0

感谢您的及时回复。您是否正在使用其他版本的Java,因为找不到您正在使用的方法。你可以在这里看到图片:http://postimg.org/image/t1fg5nj99/。我为此创建了一个房间,可以请您过来,一旦我的打印机代码正在运行,那将是所有的:https://chat.stackoverflow.com/rooms/100769/discussion-with-hotzst –

+0

您可能有错误的进口。我使用Java 8和'JSObject'是'netscape.javascript.JSObject' – hotzst

+0

JSOObject不是问题,webEngine.getLoadWorker及其后续属性。因此,“改变”的方法也没有实现。这个图像更好:http://postimg.org/image/8m2kfv175/ –

相关问题