示例介绍: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,一经查实,立即删除!

相关文章

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

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

Spring MVC自定义验证注释

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

前期

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

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

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

vue跨域解决及打包

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

Bootstrap中实现图片圆角效果

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

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 ” 。 到目前为止的故事 我确实使用了…

第二周读书笔记——《构建之法》

【对一些实例的看法】 “我写了二叉树的遍历算法实现&#xff0c;在这里&#xff0c;二叉树是数据结构&#xff0c;遍历的实现细节是算法。C程序就是结果。但是这个程序有什么实际用处呢&#xff1f;在Java和其他一些语言中&#xff0c;似乎没有指针&#xff0c;那我可以不必了…

java springmvc 数据库事务_事务的简单回顾_JavaEE框架(Maven+SpringMvc+Spring+MyBatis)全程实战教程_Java视频-51CTO学院...

SpringMVCSpring MVC属于SpringFrameWork的后续产品&#xff0c;已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色&#xff0c;这种分离让它们更容易进行定制。SpringSpring是一个开源框架&#xff0c;Spring是于2003 年兴起的…

前端 ---jQuery的补充

15-jQuery补充 jquery内容补充 jquery除了咱们上面讲解的常用知识点之外&#xff0c;还有jquery 插件、jqueryUI知识点 jqueryUI 官网&#xff1a; https://jqueryui.com/ jqueryUI 中文网&#xff1a; http://www.jqueryui.org.cn/ jquery插件内容包含 官网demo&#xff1a; h…

用Java编写Hadoop MapReduce任务

尽管Hadoop框架本身是使用Java创建的&#xff0c;但MapReduce作业可以用许多不同的语言编写。 在本文中&#xff0c;我将展示如何像其他Java项目一样&#xff0c;基于Maven项目在Java中创建MapReduce作业。 准备示例输入 让我们从一个虚构的商业案例开始。 在这种情况下&#…

Spring集成:轻量级集成方法

当今的应用程序希望能够访问企业环境中的所有业务&#xff0c;而无需考虑与绝望的系统无缝集成的应用程序技术。 可以通过使用中间件技术对各种系统进行布线来实现这种集成。 集成平台使应用程序可以相互共享信息的环境&#xff0c;从而使体系结构具有高度的互操作性。 Spring…

接口IDisposable的用法

C#的每一个类型都代表一种资源&#xff0c;而资源又分为两类&#xff1a; 托管资源 由CLR管理分配和释放的资源&#xff0c;即从CLR里new出来的对象。非托管资源 不受CLR管理的对象&#xff0c;如Windows内核对象&#xff0c;或者文件、数据库连接、套接字、COM对象等。如果类…

图形处理:betweeness中心性– neo4j的密码与graphstream

上周&#xff0c; 我写了关于中间性中心性算法以及使用graphstream 理解它的尝试 &#xff0c;在阅读源代码时&#xff0c;我意识到我可以使用neo4j的所有最短路径算法将某些东西放在一起。 概括地说&#xff0c;中间性中心度算法用于确定图中节点的负载和重要性。 在与Jen讨…

小程序之Tab切换

小程序越来越火了&#xff0c;作为一名&#xff0c;额 有理想的攻城狮&#xff0c;当然要紧跟互联网时代的步伐啦&#xff0c;于是我赶紧抽时间学习了一下小程序的开发&#xff0c;顺便把经验分享给大家。 对于申请账号以及安装开发工具等&#xff0c;大家可以看官网&#xff…

6759: 异或序列

6759: 异或序列 时间限制: 1 Sec 内存限制: 128 MB题目描述 已知一个长度为n的整数数列a1,a2,…,an&#xff0c;给定查询参数l、r&#xff0c;问在al,al1,…,ar区间内&#xff0c;有多少子序列满足异或和等于k。也就是说&#xff0c;对于所有的x,y(l≤x≤y≤r)&#xff0c;满足…

java随机数排序算法_理解快速排序算法

快速排序在平均状况下&#xff0c;排序n个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n^2)次比较&#xff0c;但这种状况并不常见。事实上&#xff0c;快速排序通常明显比 其他Ο(n log n)算法更快&#xff0c;因为它的内部循环(inner loop)可以在大部分的架构上很有效率地…