手拉手JavaFX UI控件与springboot3+FX桌面开发(下)

简介: 手拉手JavaFX UI控件与springboot3+FX桌面开发

手拉手JavaFX UI控件与springboot3+FX桌面开发(中):https://developer.aliyun.com/article/1431715


drawImage绘制图片



drawImage(Image img,double sx,double sy,double sw,double sh,double dx,double dy,double dw,double dh)


img:要绘制的图片


sx,sy,sw,sh:源矩形(s,source)


dx,dy,sw,dh:目标矩形(d,destination)


样式单CSS


CSS,Cascading Style Sheets


用于定义界面的显示样式(背景,边框,字体等)


-fx-padding:填充、-fx-font-size:字体大小、-fx-text-fill:文件颜色


新建javafx项目时,已经默认创建了一个CSS文件:application.css


图片背景



CSS文件

#pane{
    -fx-background-image: url("中国风1.JPG");
    /*-fx-background-repeat: stretch;
    -fx-background-size: 900 506;
    -fx-background-position: center center;*/
    /*-fx-effect: dropshadow(three-pass-box, black, 30, 0.5, 0, 0);*/
}
.root{
    -fx-background-image: url("中国风1.JPG");
}
Java文件
public class CSSdemo extends Application {
    TextField textField =new TextField();
    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("CSSdemo");
        BorderPane borderPane = new BorderPane();
        HBox hbox =new HBox(10);
        Button b =new Button("选择");
        Button c =new Button("提交");
        textField.getStyleClass().add("text");
        b.getStyleClass().add("button");
        hbox.getChildren().addAll(textField,b,c);
       // borderPane.setId("pane");
        borderPane.setTop(hbox);
        Scene scene =new Scene(borderPane,300,400);
        //scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
        //scene.getStylesheets().add(CSSdemo.class.getResource("style.css").toExternalForm());
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
        launch();
    }
}


SceneBuilder可视化设计



Eclipse添加javafx组件


在Work with中添加:http://download.eclipse.org/efxclipse/updates-released/2.3.0/site/


Eclpise-jdk11-javaFx


https://openjfx.cn/

module Java11 {
   exports com;
   requires javafx.base;
   requires javafx.controls;
   requires javafx.fxml;
   requires javafx.graphics;
   requires javafx.media;
   requires javafx.swing;
   requires javafx.web;
   requires javafx-swt;
}


媒体播放器


Javafx自带媒体播放的支持


Media:表示一个媒体文件(URL)


MediaPlayer:表示一个播放器(播放控件)


MediaView:表示一个播放控件(显示)


Eclpise应用程序的发布



创建一个文件夹,将jdk里的jre拷贝过去


创建启动脚本


IEDA 应用程序的发布


右击项目或模块


open module settings


选择ArtiFacts->JAR->From modules with dependencies


可以选择包含测试类或者不包含


第一个仅导出目标jar包


第二个导出目标jar包和项目所依赖的jar包


选择Include in project build


Build -> Build Artifacts -> Build


构建结果如下:


创建一个文件夹,将jdk里的jre拷贝过去


创建启动脚本


start jre\bin\javaw.exe -jar ch01.jar


登入窗口+小知识点


public class LoginDemo extends Application{
   public static void main(String[] args) {
     launch(args);
   }
   @Override
   public void start(Stage stage) throws Exception {
     stage.setTitle("Login");
     Label name =new Label("账号:");
     Label password = new Label("密码:");
     name.setFont(Font.font("宋体",20));
     TextField inname =new TextField();
     inname.setUserData("hello");
     PasswordField inPasswordField =new PasswordField();
     inPasswordField.setUserData("123456");
     Button login =new Button("登录");
     Button clear =new Button("清理");
     GridPane gr =new GridPane();
     gr.setStyle("-fx-background-color:#FFF5EE");
             //列,行
     gr.add(name, 0, 0);
     gr.add(inname, 1, 0);
     gr.add(password, 0, 1);
     gr.add(inPasswordField, 1, 1);
     gr.add(login, 1, 2);
     gr.add(clear, 0, 2);
     gr.setHgap(10);
     gr.setVgap(10);
     GridPane.setMargin(login, new Insets(0, 0, 0, 150));
     gr.setAlignment(Pos.CENTER);
     //清理事件
     clear.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
           inname.setText("");
           inPasswordField.setText("");
        }
     });
     //登录事件
     login.setOnAction((e)->{
        String name1 =inname.getText();
        String password1 =inPasswordField.getText();
        if (inname.getUserData().equals(name1) && inPasswordField.getUserData().equals(password1)) {
           loginWindos lonWindos = new loginWindos(name1);
           stage.close();
        }else {
           Alert waring = new Alert(Alert.AlertType.WARNING);
               waring.setHeaderText("用户名/密码出错");
               waring.setContentText("请重新输入!");
               //showAndWait();当输入的焦点在对话框里,后面的界面无法输入(不往下走,知道对话框关闭)
               waring.showAndWait();
               //呼吸灯
               FadeTransition fade = new FadeTransition();
               fade.setDuration(javafx.util.Duration.seconds(2));
               fade.setNode(gr);
               fade.setFromValue(0);
               fade.setToValue(1);
               fade.play();
        }
     });
     Scene scene =new Scene(gr);
     stage.setScene(scene);
     stage.setWidth(400);
     stage.setHeight(500);
     stage.setResizable(false);
     stage.show();
   }
   class  loginWindos
   {
     private final Stage stage = new Stage();
     public loginWindos(String name) {
        stage.setTitle("qgs");
         Alert waring = new Alert(Alert.AlertType.INFORMATION);
               waring.setHeaderText("欢迎"+name+"来到qgs操作界面");
               waring.showAndWait();
        stage.show();
     }
   }
}


Springboot3+JavaFX


Pom.xml加入依赖

<dependency>
   <groupId>org.openjfx</groupId>
   <artifactId>javafx-controls</artifactId>
   <version>17.0.2</version>
</dependency>

package com.example.fx;
import javafx.application.Application;
import javafx.application.HostServices;
import javafx.geometry.Rectangle2D;
import javafx.scene.Cursor;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Screen;
import javafx.stage.Stage;
public class fxmain extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("SceneDemo");
        BorderPane borderPane =new BorderPane();
        TextArea textArea =new TextArea();
        HBox hbox =new HBox();
        Button openbaidu =new Button("打开百度");
        Button getScreenvalue = new Button("获取屏幕属性值");
        hbox.getChildren().addAll(openbaidu,getScreenvalue);
        openbaidu.setOnAction((e)->{
            HostServices hostServices = getHostServices();
            hostServices.showDocument("https://www.baidu.com/");
        });
        getScreenvalue.setOnAction((e)->{
            Screen primary = Screen.getPrimary();
            double dpi = primary.getDpi();
            System.out.println("当前屏幕dpi:"+dpi);
            Rectangle2D rec1 = primary.getBounds();
            Rectangle2D rec2 = primary.getVisualBounds();
            textArea.appendText("\n----全部屏幕--------");
//            textArea.appendText("\n左上角x:"+rec1.getMinX()+"左上角y"+rec1.getMinY());
//            textArea.appendText("\n右下角x--"+ rec1.getMaxX()+"右下角y--"+ rec1.getMaxY());
            textArea.appendText("\n宽度:"+rec1.getWidth()+"高度"+rec1.getHeight());
            textArea.appendText("\n----可以看到的屏幕--------");
//            textArea.appendText("\n左上角x:"+rec2.getMinX()+"左上角y"+rec2.getMinY());
//            textArea.appendText("\n右下角x--"+ rec2.getMaxX()+"右下角y--"+ rec2.getMaxY());
            textArea.appendText("\n宽度:"+rec2.getWidth()+"高度"+rec2.getHeight());
        });
        borderPane.setTop(hbox);
        borderPane.setCenter(textArea);
        Scene scene =new Scene(borderPane,400,400);
        scene.setCursor(Cursor.CLOSED_HAND);//手
        /**
         * scene.setCursor(Cursor.HAND);//手,箭头啥的
         * Cursor CROSSHAIR  光标十字光标
         * Cursor . DEFAULT 光标默认值
         * Cursor DISAPPEAR   光标消失
         * Cursor CLOSED_HAND 光标闭合手
         * Contextmenudemo 上下文菜单演示
         * Cursor E _ RESIZE 光标E _ RESIZE
         */
        stage.setScene(scene);
        stage.show();
    }
}

package com.example.fx;
import com.example.domain.Corrdinate;
import com.example.util.EasyExcelUtil;
import javafx.application.Application;
import javafx.application.HostServices;
import javafx.geometry.Rectangle2D;
import javafx.scene.Cursor;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.FileChooser;
import javafx.stage.Screen;
import javafx.stage.Stage;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class fxmain extends Application {
    private static String filePath =null;
    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("坐标验证");
        BorderPane borderPane =new BorderPane();
        TextArea textArea =new TextArea();
        HBox hbox =new HBox();
        Button openbaidu =new Button("打开百度");
        Button upFile =new Button("上传文件");
        Button executeFile =new Button("执行");
        Button getScreenvalue = new Button("获取屏幕属性值");
        hbox.getChildren().addAll(upFile,executeFile);
        openbaidu.setOnAction((e)->{
            HostServices hostServices = getHostServices();
            hostServices.showDocument("https://www.baidu.com/");
        });
        //上传文件
        upFile.setOnAction((e)->{
            FileChooser fileChooser = new FileChooser();
            fileChooser.setTitle("选择Excel文件");
            fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
            //过滤
            fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("All Excel", "*.xlsx"),
                    new FileChooser.ExtensionFilter("XLS", "*.xls"), new FileChooser.ExtensionFilter("XLSX", "*.xlsx"));
            File file = fileChooser.showOpenDialog(stage);
            try {
                System.out.println("路径:"+file.getCanonicalPath());
                textArea.setText("路径:"+file.getCanonicalPath());
                filePath=file.getCanonicalPath();
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
            if (file != null) {
            }
        });
        //执行
        executeFile.setOnAction((e)->{
            List<Corrdinate> list = EasyExcelUtil.importExcel(filePath);
            textArea.setText("生成文件路径C:\\Users\\Administrator\\Desktop\\demofile");
            for (Corrdinate corrdinate : list) {
                textArea.appendText("\n"+corrdinate.toString());
            }
        });
        getScreenvalue.setOnAction((e)->{
            Screen primary = Screen.getPrimary();
            double dpi = primary.getDpi();
            System.out.println("当前屏幕dpi:"+dpi);
            Rectangle2D rec1 = primary.getBounds();
            Rectangle2D rec2 = primary.getVisualBounds();
            textArea.appendText("\n----全部屏幕--------");
//            textArea.appendText("\n左上角x:"+rec1.getMinX()+"左上角y"+rec1.getMinY());
//            textArea.appendText("\n右下角x--"+ rec1.getMaxX()+"右下角y--"+ rec1.getMaxY());
            textArea.appendText("\n宽度:"+rec1.getWidth()+"高度"+rec1.getHeight());
            textArea.appendText("\n----可以看到的屏幕--------");
//            textArea.appendText("\n左上角x:"+rec2.getMinX()+"左上角y"+rec2.getMinY());
//            textArea.appendText("\n右下角x--"+ rec2.getMaxX()+"右下角y--"+ rec2.getMaxY());
            textArea.appendText("\n宽度:"+rec2.getWidth()+"高度"+rec2.getHeight());
        });
        borderPane.setTop(hbox);
        borderPane.setCenter(textArea);
        Scene scene =new Scene(borderPane,400,400);
        scene.setCursor(Cursor.CLOSED_HAND);//手
        /**
         * scene.setCursor(Cursor.HAND);//手,箭头啥的
         * Cursor CROSSHAIR  光标十字光标
         * Cursor . DEFAULT 光标默认值
         * Cursor DISAPPEAR   光标消失
         * Cursor CLOSED_HAND 光标闭合手
         * Contextmenudemo 上下文菜单演示
         * Cursor E _ RESIZE 光标E _ RESIZE
         */
        stage.setScene(scene);
        stage.show();
    }
}


jdk1.8以上的版本(jdk9,jdk11,jdk17等)没有jre的问题


D:\Program Files\Java\jdk-17目录下执行


bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre


目录
相关文章
|
15天前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
65 15
|
15天前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
54 11
|
2月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
204 7
|
2月前
|
人工智能 Java 数据库
飞算 JavaAI:革新电商订单系统 Spring Boot 微服务开发
在电商订单系统开发中,传统方式耗时约30天,需应对复杂代码、调试与测试。飞算JavaAI作为一款AI代码生成工具,专注于简化Spring Boot微服务开发。它能根据业务需求自动生成RESTful API、数据库交互及事务管理代码,将开发时间缩短至1小时,效率提升80%。通过减少样板代码编写,提供规范且准确的代码,飞算JavaAI显著降低了开发成本,为软件开发带来革新动力。
|
15天前
|
存储 开发框架 API
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发二
本文详细介绍了基于声明式UI开发的健康饮食应用的设计与实现过程。内容涵盖从基础环境搭建到复杂功能实现的全流程,包括创建简单视图、构建布局(如Stack、Flex)、数据模型设计、列表与网格布局构建,以及页面跳转和数据传递等核心功能。 本文通过实际案例深入浅出地解析了声明式UI开发的关键技术和最佳实践,为开发者提供了宝贵的参考。
53 14
|
7天前
|
JavaScript 前端开发 UED
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发四
本文介绍了Web组件开发与性能优化的相关内容。在Web组件开发部分,涵盖创建组件、设置样式与属性、添加事件和方法以及场景示例,如动态播放视频。性能提升方面,推荐使用数据懒加载、条件渲染替代显隐控制、Column/Row替代Flex、设置List组件宽高及调整cachedCount减少滑动白块等方法,以优化应用性能与用户体验。
31 1
|
11天前
|
JavaScript 前端开发 开发者
09.HarmonyOS Next数据驱动UI开发:ForEach与动态渲染完全指南(上)
在现代前端开发中,数据驱动UI已成为主流开发范式。HarmonyOS Next的ArkTS语言和声明式UI框架完美支持这一理念,使开发者能够以更高效、更直观的方式构建复杂应用。
43 1
|
1月前
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
143 2
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
7天前
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
43 0
|
2月前
|
人工智能 物联网 编译器
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
79 11
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡