JAVA8新推出了javafx,一直关注,但是一直没有机会在项目中运用。正好最近有一个机会,可以让我体会一下javafx的与众不同。

  • 项目背景:某物流公司需要一批机器用作取单机,主要是通过扫描取单人的二维码,进行单据信息打印。PC主要是windows系统普通电脑、触摸屏、打印机是HP1020黑白激光打印机、扫码机,全部设备封装成一个整机。
  • 设计思路:将javafx程序封装成EXE软件,安装部署在每台机器上,然后通过HTTP发起请求,调取服务器接口,验证和拉取数据。
  • 项目开发过程:页面调试 --> 打印调试 --> 接口调试 --> 导出jar包 --> 封装EXE文件 --> 传入真机测试

项目运行效果:

单号扫面验证页面:

Java windows桌面 java开发windows桌面程序_java


单据打印展示页面:

Java windows桌面 java开发windows桌面程序_操作系统_02


打印效果页面:

A5纸张,横版打印

Java windows桌面 java开发windows桌面程序_Java windows桌面_03


项目目录结构:

Java windows桌面 java开发windows桌面程序_jar包_04


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程序