JAVA8新推出了javafx,一直关注,但是一直没有机会在项目中运用。正好最近有一个机会,可以让我体会一下javafx的与众不同。
- 项目背景:某物流公司需要一批机器用作取单机,主要是通过扫描取单人的二维码,进行单据信息打印。PC主要是windows系统普通电脑、触摸屏、打印机是HP1020黑白激光打印机、扫码机,全部设备封装成一个整机。
- 设计思路:将javafx程序封装成EXE软件,安装部署在每台机器上,然后通过HTTP发起请求,调取服务器接口,验证和拉取数据。
- 项目开发过程:页面调试 --> 打印调试 --> 接口调试 --> 导出jar包 --> 封装EXE文件 --> 传入真机测试
项目运行效果:
单号扫面验证页面:

单据打印展示页面:

打印效果页面:
A5纸张,横版打印

项目目录结构:

LoginController
是项目的主入口,PrintController
是打印页面。application.css
是打印页面展示效果的CSS,application_print.css
是打印页面打印效果的CSS。lib目录下是该项目所用到的第三方jar包。MainController
是测试打印页面的类。
项目主要功能点
这里主要写我做这几个页面时候遇到的问题以及解决方案。
- 页面之间跳转和传参
单号扫面页面在验证单号成功后,需要跳转到打印页面,并且将单号传递到打印页面的接口中,拉去详细数据。下面是简单的代码实现,具体实现请参考源码中的LoginController
类
//确定按钮点击事件
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
//关闭当前页面
primaryStage.close();
try {
//打开打印页面,并将参数传递到构造方法中
new PrintController(“123456” ,primaryStage);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
- 打印展示页面和打印页面
因为电脑的分辨率比较高,显示内容较多,所以打印页面和展示页面必须分开定义,CSS也需要两套。
- 打印按钮和打印方法实现
public Parent getPrintBut() {
/*---------------------------------打印按钮---------------------------------*/
Button btn = new Button("打印");
btn.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
HBox hbBtn = new HBox(10);
hbBtn.setAlignment(Pos.TOP_CENTER);
hbBtn.getChildren().add(btn);
hbBtn.setMaxHeight(300);
hbBtn.prefHeight(300);
hbBtn.setFillHeight(false);
// 打印按钮点击事件
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("............开始打印..............");
Printer printer = Printer.getDefaultPrinter();
//设置打印纸张和打印样式(PageOrientation.LANDSCAPE:横版打印)
PageLayout paper = printer.createPageLayout(Paper.A4, PageOrientation.LANDSCAPE, MarginType.DEFAULT);
//创建打印任务
PrinterJob job = PrinterJob.createPrinterJob();
JobSettings jobSetting = null;
if (job != null) {
//调取打印页面
Scene scene = new Scene(createContent3());
//加载打印页面CSS样式
scene.getStylesheets().add(getClass().getResource("application_print.css").toExternalForm());
jobSetting = job.getJobSettings();
jobSetting.setCopies("2"); //设置一次打印张数
job.printPage(paper, createContent3());
// job.printPage(createContent3());
// job.printPage(getTableView());
job.endJob();
// 获取MAC地址
InetAddress ia;
try {
ia = InetAddress.getLocalHost();
String mac = IntenetTool.getLocalMac(ia);
// 向打印接口传递打印记录和当前机器的MAC地址作为唯一标识
String planDistDriver_uri = url + "print/updPlanDistStatus?code=" + code+"&macAddress="+mac;
//请求HTTP接口
com.erdos.thb.tools.HttpClient.gethttpResponse(planDistDriver_uri);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
primaryStage.close();
new LoginController().start(primaryStage);
}
});
return hbBtn;
}
项目源码
项目源码下载
eclipse导出jar包(包含全部外包jar包)
eclipse导出jar包
使用exe4j打包Java程序
将jar包打包成exe程序