2016-01-15 65 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/ –

相關問題