javafx 示例_示例介绍:JavaFX 8打印

javafx 示例

我有一段时间没有写博客了,我想与其他人分享有关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功能接口。 我将不在这里讨论它们,但将使您参考Oracle关于Lambda的教程。

必备软件:

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 ,一个Button和一个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

javafx 示例

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

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

相关文章

【MFC系列-第20天】CDC绘图类成员介绍

20.1 三大坐标系:屏幕、客户区和非客户区 20.2 三大派生类: a)CPaintDC(客户区标准绘图),内部封装函数是:BeginPaint和EndPaint b)CClientDC(客户区非标准绘图),内部是:::GetDC和ReleaseDC …

Spring Data JPA教程

在Java类或对象与关系数据库之间管理数据是一项非常繁琐且棘手的任务。 DAO层通常包含许多样板代码,应简化这些样板代码,以减少代码行数并使代码可重复使用。 在本教程中,我们将讨论Spring数据的JPA实现。 1.简介 1.1什么是JPA?…

【MFC系列-第21天】GDI算法实战——过渡色

21.1 Caption过渡色实现 // 方法一 void CCaptionDlg::DrawColorTitle(CRect rect, COLORREF col1, COLORREF col2,CDC* pDC) {int cx rect.Width();int red GetRValue(col2) - GetRValue(col1);int green GetGValue(col2) - GetGValue(col1);int blue GetBValue(col2) -…

在Spring MVC中处理域对象

最近,我惊讶于一个代码库在其所有域实体中都具有公共默认构造函数(即零参数构造函数),并且所有字段都具有getter和setter。 当我深入研究时,我发现域实体之所以如此,主要是因为该团队认为Web / MVC框架需要…

【有限域元素加法和乘法】有限域元素加法和乘法的原理及MATLAB实现

关注公号【逆向通信猿】更精彩!!! 有限域 仍然以 r = 4 r=4 r=4,

使用storm 实时计算_使用Storm进行可扩展的实时状态更新

使用storm 实时计算在本文中,我将说明如何借助Storm框架以可扩展且无锁定的方式在数据库中维护实时事件驱动流程的当前状态。 Storm是基于事件的数据处理引擎。 它的模型依赖于基本原语,例如事件转换,过滤,聚合……,我…

【MFC系列-第22天】GDI算法实战——过渡色

关注公号【逆向通信猿】更精彩!!! 第22天 GDI算法实战 CDC(HDC)绘图类: 五大GDI对象类:CPen,CBrush,CFont,CBitmap,CRgn 22.1 走马灯 设置定时器 SetTimer(1, 20, N…

无服务器:不费吹灰之力!

几年前, 集装箱横扫开发人员,而开发人员的土地就像6级飓风一样 。 码头工人 Rkt 。 其他 。 Docker Swarm 。 K8s 。 OpenShift 。 现在,我们实际上处于震中,但是当我们瞥见地平线时,我们看到另一个人来了&#x…

【MFC系列-第23天】CMemoryDC的封装过程

CDC(HDC)绘图类: 五大GDI对象类:CPen,CBrush,CFont,CBitmap,CRgn 23.1 LoadImage API HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName, UINT uType, int cxDesired,int cyDesired,UINT fuLoad );uT…

JDK 8与JDK 10:三元/拆箱的区别

最近的Nicolai Parlog ( nipafx ) 鸣叫引起了我的注意,因为它引用了关于JDK 8和JDK 10之间行为更改的有趣StackOverflow讨论 ,并询问“为什么?” SerCe 在StackOverflow线程上引用的问题最终归结为在JDK 8和JDK 10之间…

【多元域乘法】多项式乘法电路原理及MATLAB详解

关注公号【逆向通信猿】更精彩!!! 关于二元域上的两个元素的乘法、多项式除法,在之前的博客 【有限域除法】二元多项式除法电路原理及MATLAB详解 子程序:sub_poly_div.m 【有限域元素加法和乘法】有限域元素加法和乘法的原理及MATLAB实现 子程序:sub_gf_add.m、sub_gf_…

my CSAPP Attack lab堆栈详解

关注公号【逆向通信猿】更精彩!!! 这个实验时学习了简书上的一篇文章后,自己根据课程例子进行的一次小测试,phase 4和5的堆栈图解还没有画,等后续有时间会进行补充。 本人转载的简书原文: https://blog.csdn.net/wlwdecs_dn/article/details/121249364#comments_19237…

Spring MVC教程

1.简介 作为企业Java开发人员,这项工作的主要重点之一是开发Web应用程序。 对于Web应用程序,后果还包括许多挑战。 具体来说,其中一些是状态管理,工作流和验证。 HTTP协议的无状态性质只会使事情变得更加复杂。 Spring的Web框架旨…

【MFC系列-第24天】梯形分页和蝴蝶QQ宠物的实现

CDC(HDC)绘图类: 五大GDI对象类:CPen,CBrush,CFont,CBitmap,CRgn 24.1 梯形分页的双缓冲改进和尺寸自适应 24.2 蝴蝶跟随鼠标点击运动 class CHitFlyDlg : public CDialogEx {CMemoryDC m_dc;//缓冲enu…

ubuntu22.04 下载路径

ftp下载路径 csdn下载 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.001资源-CSDN文库 ubuntu22.04下载路径ubuntu-22.04-desktop-amd64.7z.002资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.003资源-CSDN文库 【免费】ubuntu-22.04-desktop-amd64.7z.004资源-…

camel seda 协议_探索Apache Camel Core – Seda组件

camel seda 协议Apache Camel中的seda组件与我在先前的博客中介绍的direct组件非常相似,但是以异步的方式。 为此,它使用java.util.concurrent.BlockingQueue作为默认实现来使消息排队并与主Route线程断开连接,然后在单独的线程中处理消息。 …

【MFC系列-第25、26天】绘图软件

25.1 绘图软件的绘制原理 纯虚函数:抽象函数,强制在派生类中进行实现; 虚函数:有函数体,可在基类也可在派生类中实现。 基类CLayer class CLayer {//抽象类 public:CLayer();~CLayer();virtual void OnDraw(CDC* pDC…

Java 10:“ var”关键字

Java 10使用关键字var引入了局部变量类型推断 。 这意味着无需编写&#xff1a; Map<Department, List<Employee>> map new HashMap<>(); // ... for (Entry<Department, List<Employee>> dept : map.entrySet()) {List<Employee> emplo…

【MFC系列-第32天】控件自绘技术

32.1 对话框背景设置 方法一 BOOL CClDlg::OnEraseBkgnd(CDC* pDC) {CRect rect;GetClientRect(rect);pDC->FillSolidRect(rect, RGB(200, 255, 255));return TRUE; }方法二&#xff1a;WM_CTRLCOLOR消息 按类型按句柄按控件ID HBRUSH CMFCApplication1Dlg::OnCtlColor(…

Spring Reactor教程

在RESTful服务的世界中&#xff0c;实际上实际上是在幕后进行许多工作&#xff0c;我们通常必须在应用程序中进行很多处理&#xff0c;而实际上并不会影响需要发送给真实用户的响应。 可以被动地做出这些业务决策&#xff0c;以便它们对与应用程序交互的用户没有任何影响。 Spr…