示例介绍:JavaFX 8打印

我有一段时间没有写博客了,我想与其他人分享有关JavaFX的所有信息(我的日常工作和家庭可能是借口)。 对于那些是本博客的新手,我是JavaFX 2 Introduction by Example(JIBE)的作者, Java 7 Recipes的合著者以及Apress出版的Pro JavaFX 2书籍的技术审阅者。 对于那些已经认识我的人,我要感谢您通过购买这些书对我和其他作者的支持。 更重要的是,我希望与Java爱好者接触并分享想法。

他预定的JavaFX 2简介通过实例  于2011年11月发布,此后又添加了许多API。 在本书写作期间,我一直在研究JavaFX 2.0的早期版本,直到2011年10月JavaOne宣布为止。由于事情几乎是一成不变的,试图根据API的变化来更新本书非常疯狂。 我以为它竟然出​​了门真是太神奇了。 但是,我很高兴。 有些你们谁读的书(JIBE)的开始明白,JIBE的章节在书中Java 7的食谱也被找到(实际上它最初是从Java 7个食谱服用)。 这个事实说明了为什么JavaFX 2 Introduction by Example这本书让人想起食谱或食谱风格的技术书籍。 我的目的是帮助读者快速入门,而又无需太多技术问题。 与其尝试使人们相信JavaFX平台,不如通过有用的示例进行演示。 我发现,就一种特定技术为何优于另一种特定技术(俗气的80年代的Highlander参考文献 )进行深入的哲学辩论是没有用的。

压脚提升的JavaFX 2.0的发布,才出现了后来的版本,如JavaFX的2.1,2.2和JavaFX 8即将发布(2014年1月)。 在此博客文章中,我将提供JavaFX 8的Printing API的配方。 与我的书(JIBE)相似,我将遵循以前介绍问题,解决方案,代码和“工作原理”部分的相同模式。

声明 :在此博客中,您将遇到使用Lambda表达式的Java功能接口。 我将不在这里讨论它们,但将使您参考有关Project Lambda的 Oracle教程。

必备软件:

JDK 8 – https://jdk8.java.net/download.html

问题

您要创建一个JavaFX应用程序,以打印出访问过的网站。

使用JavaFX 8 PrintJobPrinter API打印任何JavaFX场景图节点。 另外,使用WebViewWebEngine API显示网站或网页。

使用说明

假设您已经编译并运行了该应用程序,请按照以下说明进行操作:

  1. 在文本字段中输入网站地址或网址。
  2. 按下回车键
  3. 页面加载后,单击“打印”按钮
  4. 转到打印机以获取打印的网页

package org.carlfx;import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.concurrent.Worker.State;
import javafx.print.*;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.transform.Scale;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;/*** Demo to use JavaFX 8 Printer API.** @author cdea*/
public class PrintDemo extends Application {@Overridepublic void start(Stage primaryStage) {final TextField urlTextField = new TextField();final Button printButton = new Button("Print");final WebView webPage = new WebView();final WebEngine webEngine = webPage.getEngine();HBox hbox = new HBox();hbox.getChildren().addAll(urlTextField, printButton);BorderPane borderPane = new BorderPane();borderPane.setTop(hbox);borderPane.setCenter(webPage);Scene scene = new Scene(borderPane, 300, 250);primaryStage.setTitle("Print Demo");primaryStage.setScene(scene);// print button pressed, page loadedfinal BooleanProperty printButtonClickedProperty = new SimpleBooleanProperty(false);final BooleanProperty pageLoadedProperty = new SimpleBooleanProperty(false);// when the a page is loaded and the button was pressed call the print() method.final BooleanProperty printActionProperty = new SimpleBooleanProperty(false);printActionProperty.bind(pageLoadedProperty.and(printButtonClickedProperty));// WebEngine updates flag when finished loading web page.webEngine.getLoadWorker().stateProperty().addListener( (ChangeListener) (obsValue, oldState, newState) -> {if (newState == State.SUCCEEDED) {pageLoadedProperty.set(true);}});// When user enters a url and hits the enter key.urlTextField.setOnAction( aEvent ->  {pageLoadedProperty.set(false);printButtonClickedProperty.set(false);webEngine.load(urlTextField.getText());});// When the user clicks the print button the webview node is printedprintButton.setOnAction( aEvent -> {printButtonClickedProperty.set(true);});// Once the print action hears a true go print the WebView node.printActionProperty.addListener( (ChangeListener) (obsValue, oldState, newState) -> {if (newState) {print(webPage);}});primaryStage.show();}/** 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();}}}/*** The main() method is ignored in correctly deployed JavaFX application.* main() serves only as fallback in case the application can not be* launched through deployment artifacts, e.g., in IDEs with limited FX* support. NetBeans ignores main().** @param args the command line arguments*/public static void main(String[] args) {launch(args);}
}

使用JavaFX 8进行打印演示

怎么运行的

他代码首先创建一个TextField,按钮,和一个WebView控件被放置到一个BorderPane。 使用BorderPane布局时,您可以将控件放置在以下区域中:顶部,右侧,左侧,底部和中心。

与网络浏览器类似,文本字段允许用户输入网站网址。 输入URL后,用户将按Enter键将网页加载到WebView节点中。 将控件放置在任何侧面区域上时,BorderPane布局将采用添加的所有控件的首选高度。 中心区域将允许节点占用可用空间减去边界侧边区域的宽度和高度所占用的剩余空间。 换句话说,如果侧面区域不包含节点(空),则位于中心区域的节点将有机会占用其父级(场景)提供的所有可用宽度和高度空间。 由于WebView节点将占据中心区域,因此在完全加载网页后,它将占据所有可用的宽度和高度(减去顶部区域)。 您还将注意到滚动条,该滚动条允许用户查看大于当前查看端口的页面。

布置完UI的所有组件后,您需要进行连接。 在这里,您将简单地创建三个布尔属性
(javafx.beans.property.SimpleBooleanProperty)实例。 第一个属性变量printButtonClickedProperty是一个标志,指示何时单击打印按钮。 第二个属性pageLoadedProperty是一个标志,指示该网页已完成加载。 最后,您将需要注意printActionProperty ,它通过使用流畅的API绑定了printButtonClickedProperty和pageLoadedProperty。 当他们评估时,如果printLoadedProperty和printLoadedProperty均为真值,则printActionProperty将为true。

// print button pressed, page loaded
final BooleanProperty printButtonClickedProperty = new SimpleBooleanProperty(false);
final BooleanProperty pageLoadedProperty = new SimpleBooleanProperty(false);// when the a page is loaded and the button was pressed call the print() method.
final BooleanProperty printActionProperty = new SimpleBooleanProperty(false);
printActionProperty.bind(pageLoadedProperty.and(printButtonClickedProperty));

çontinuing接线了UI的,我花了一个事件驱动的方法,把处理程序代码将事件和性能的变化。 从WebView节点开始,我将处理程序代码附加到statePropery实例(ChangeListener),以便在成功加载网页后将pageLoadedProperty设置为true。

// WebEngine updates flag when finished loading web page.webEngine.getLoadWorker().stateProperty().addListener( (ChangeListener) (obsValue, oldState, newState) -> {if (newState == State.SUCCEEDED) {pageLoadedProperty.set(true);}});

ñ分机,你会看到一个包含处理程序代码,复位pageLoadedPropertyprintButtonClickedProperty对象的文本字段的“setOnAction”的方法。 同样,代码将通过WebViewWebEngine load()方法启动页面的加载。

// When user enters a url and hits the enter key.urlTextField.setOnAction( aEvent ->  {pageLoadedProperty.set(false);printButtonClickedProperty.set(false);webEngine.load(urlTextField.getText());});

压脚提升TextField的控制的动作代码是有线了,打印按钮,还需要处理程序代码到printButtonClickedProperty标志设置为true。 最后,当printActionProperty属性的状态评估为true时,它需要一个ChangeListener来响应。 当此评估为true时,将调用我的print()方法。

// When the user clicks the print button the webview node is printedprintButton.setOnAction( aEvent -> {printButtonClickedProperty.set(true);});// Once the print action hears a true go print the WebView node.printActionProperty.addListener( (ChangeListener) (obsValue, oldState, newState) -> {if (newState) {print(webPage);}});

˚Finally,打印()方法采用要被打印的JavaFX的节点对象。 Printer对象具有一种方法,该方法返回计算机设置为的默认打印机。 在实际打印之前,我们可以导出默认页面布局以在打印节点之前缩放节点。 如果不这样做,将仅打印部分网页。 获得默认打印机后,将调用createPrinterJob()方法以返回执行实际打印的PrinterJob实例。 要打印JavaFX可显示类型的节点,只需将Node实例作为参数传入即可调用PrinterJob对象的printPage()方法。

/** 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();}}}

I N最后,我发现,API是简单相比的Java Swing / AWT API来使用。 我想提一下,您可以使用许多功能,因为此博客条目仅涉及当前可用API的表面。

注意:JavaFX 8打印机API仍处于早期阶段,仍然存在未解决的问题(Jira问题)。

参考: 示例介绍:JavaFX 8由我们的JCG合作伙伴 Carl Dea在Carl's FX Blog博客上进行打印 。

翻译自: https://www.javacodegeeks.com/2013/07/introduction-by-example-javafx-8-printing.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

placeholder的使用

1.定义 placeholder 属性提供可描述输入字段预期值的提示信息 该提示会在输入字段为空时显示&#xff0c;并会在字段获得焦点时消失。 注释&#xff1a;placeholder 属性适用于以下的 <input> 类型&#xff1a;text, search, url, telephone, email 以及 password。 2.用…

字符串练习

字符串练习&#xff1a; http://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html 取得校园新闻的编号 trhttp://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html print(a[-14:-5])https://docs.python.org/3/library/turtle.html 产生python文档的网址 trhttps:/…

CSS清除行内元素之间的HTML空白

至今我还记得年轻是在IE6上开发的那些苦逼日子,特别希望IE浏览器采用 inline-block 的显示方式.行内块(inline-block)是非常有用的,特别是想要不用block和float来控制这些行内元素的margin,padding之时。问题来了,HTML源码中行内元素之间的空白有时候显示在屏幕上那是相当的讨厌…

int64 java_为什么json 不能使用 int64类型

json 简介jsON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集 。 JSON采用完全独立于语言的文本格式&#xff0…

Spring MVC自定义验证注释

在上一教程中&#xff0c;我展示了如何使用注释来验证表单 。 这对于简单的验证非常有用&#xff0c;但是最终&#xff0c;您需要验证一些现成的注释中没有的自定义规则。 例如&#xff0c;如果您需要根据输入的出生日期来验证用户已超过21岁&#xff0c;或者可能需要验证用户的…

Best Time to Buy and Sell Stock with Cooldown

https://soulmachine.gitbooks.io/algorithm-essentials/java/dp/best-time-to-buy-and-sell-stock-with-cooldown.html转载于:https://www.cnblogs.com/ZhiHao-queue/p/9521933.html

前期

转载于:https://www.cnblogs.com/joker157/p/8618091.html

解决IE8下body{ overflow:hidden;}无效的解决办法

css中IE8 body{ overflow:hidden;}无效的解决办法&#xff1a; 在页面html中使用: body{ overflow:hidden; } 在ie8下无效 &#xff0c;仍然有滚动条。 解决的办法如下&#xff1a; 替换为如下: html { overflow:hidden; } 这样就可以实现隐藏滚动条了 而且兼容目前所有的浏览器…

0基础能学mysql数据库吗_mysql学习入门:零基础如何使用mysql创建数据库表?

零基础如何自学Mysql创建数据库&#xff0c;是Mysql学习者必经之路&#xff0c;Mysql是受欢迎的关系数据库管理系统,WEB应用方面MySQL是很好的RDBMS应用软件之一。如何使用Mysql创建数据库表&#xff0c;打开Mysql学习进阶大门&#xff0c;就是今天MYSQL学习教程丁光辉博客认为…

使用ANTLR和Java创建外部DSL

在以前的一段时间里&#xff0c;我曾写过有关使用Java的内部DSL的文章。 在Martin Fowler撰写的《 领域特定语言 》一书中&#xff0c;他讨论了另一种称为外部DSL的DSL&#xff0c;其中DSL是用另一种语言编写的&#xff0c;然后由宿主语言进行解析以填充语义模型。 在前面的示…

vue跨域解决及打包

打包之前需要修改如下配置文件&#xff1a; 配置文件一&#xff1a;build>>>utils.js (修改publicPath:"../../" , 这样写是处理打包后找不到静态文件&#xff08;图片路径失效&#xff09;的问题) 配置文件二&#xff1a;config>>>index.js(修改a…

8. Oracle 联机重做日志文件(ONLINE LOG FILE)

转载自&#xff1a;http://blog.csdn.net/leshami/article/details/5749556 一、Oracle中的几类日志文件 Redo log files -->联机重做日志 Archive log files -->归档日志 Alert log files -->告警日志 Trace files -->跟踪日志 user_dump_…

Bootstrap中实现图片圆角效果

Bootstrap 对图片的支持。Bootstrap 提供了三个可对图片应用简单样式的 class&#xff1a; .img-rounded&#xff1a;添加 border-radius:6px 来获得图片圆角。.img-circle&#xff1a;添加 border-radius:500px 来让整个图片变成圆形。.img-thumbnail&#xff1a;添加一些内边…

java 唯一索引冲突_JPA merge联合唯一索引无效问题解决方案

问题JPA的merge()操作 是合并的意思&#xff0c;就是当保存的实体时&#xff0c;根据主键id划分&#xff0c;如果已存在&#xff0c;那么就是更新操作&#xff0c;如果不存在&#xff0c;就是新增操作但是这个仅针对 主键id 划分&#xff0c;对联合唯一索引 无效&#xff0c;两…

Spring MVC测试框架入门–第1部分

最新推出的主要Spring框架是Spring MVC测试框架&#xff0c;Spring Guys声称它是“一流的JUnit支持&#xff0c;可通过流畅的API测试客户端和服务器端Spring MVC代码” 1 。 在这个博客以及下一个博客中&#xff0c;我将看一看Spring的MVC测试框架&#xff0c;并将其应用于我现…

metaclass

用metaclass来指定类C的元类是MyTypeclass MyType:def __init__(cls, *args, **kwargs):print(here!)#由于metaclassMyType&#xff0c;所以执行到这一步的时候&#xff0c;会调用MyType的构造函数 class C(metaclassMyType):def __init__(self):pass对象后面跟()&#xff0c;是…

Bootstrap中的条纹进度条使用案例

创建一个条纹的进度条的步骤如下&#xff1a;1.添加一个带有 class .progress 和 .progress-striped 的 <div>2.接着在上面的 <div> 内&#xff0c;添加一个带有 class .progress-bar 和 class progress-bar-* 的空的 <div>。其中&#xff0c;* 可以是succes…

LM拟合算法

一、 Levenberg-Marquardt算法 &#xff08;1&#xff09;ya*e.^(-b*x)形式拟合 clear all % 计算函数f的雅克比矩阵&#xff0c;是解析式 syms a b y x real; fa*exp(-b*x); Jsymjacobian(f,[a b]); % 拟合用数据。参见《数学试验》&#xff0c;p190&#xff0c;例2 % data_1…

java的前生今世_HBaseGC的前生今世-身世篇

网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术&#xff0c;提供稳定流畅、低时延、高并发的视频直播、录制、存储、转码及点播等音视频的PAAS服务&#xff0c;在线教育、远程医疗、娱乐秀网易视频云是网易倾力打造的一款基于云计算的分布式…

CapeDwarf – Java EE上的Google App Engine

我有很多爱好。 从早期的Java EE规范一路走来&#xff0c;并通过Java EE 7进行了“云”之旅&#xff0c;我很好奇看到新宣布的CapeDwarf项目有哪些库存&#xff0c;可以在内部引入Google的平台即服务&#xff0c;提供“ Google App Engine ” 。 到目前为止的故事 我确实使用了…