前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >手拉手JavaFX场景

手拉手JavaFX场景

原创
作者头像
QGS
发布于 2024-01-26 15:04:36
发布于 2024-01-26 15:04:36
58300
代码可运行
举报
文章被收录于专栏:QGS星球QGS星球
运行总次数:0
代码可运行

JAVAFX

jdk1.8以上引入javafx类库

JDK11+JAVAFX(eclipse)

方式一

方式二

直接引入

避免

另一种编写方式

小知识点

setHgrow或setVgrow、需要精确布局时,应重写layoutChildren()值摆放每一个子节点

setHgrow(hbox,Priority.ALWAYS);

javafx有4中控件来表示多项数据

ListView:列表

TreeView:树

TableView:表格

TreeTableView:多列列表

环境配置

舞台Stage

舞台(场景(布局(控件)))

JavaFX需要继承:javafx.application.AppLication

需要实现方法start

创建main方法 调用launch

需要stage调用show方法

stage.setOpacity(0.9);//设置透明度 0-1

//X,Y监听事件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stage.xProperty().addListener(new ChangeListener<Number>() {


        @Override

        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {

           System.out.println("X窗口现在坐标:"+newValue);

           System.out.println("X窗口之前坐标:"+oldValue);

        }

     });

    

     stage.yProperty().addListener(new ChangeListener<Number>() {


        @Override

        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {

           System.out.println("Y窗口现在坐标:"+newValue);

           System.out.println("Y窗口之前坐标:"+oldValue);

        }

     });



//创建多个窗口,设置模式

Stage s1 =new Stage();

     //s1.initStyle(StageStyle.TRANSPARENT);//透明的

     s1.initStyle(StageStyle.UNIFIED);

     s1.show();

    

    

     Stage s2 =new Stage();

     s2.setTitle("5");

     s2.initStyle(StageStyle.UTILITY);

     //s2.initStyle(StageStyle.UNDECORATED);//白色不带装饰

     s2.show();


// APPLICATION_MODAL设置初始化模态

S2关闭之后才能操作其他窗口

Stage s1 =new Stage();

     s1.setTitle("s1");

     s1.show();

    

    

     Stage s2 =new Stage();

     s2.initModality(Modality.APPLICATION_MODAL);

     s2.setTitle("s2");

     s2.show();


// WINDOW_MODAL设置初始化模态

Stage s1 =new Stage();

     s1.setTitle("s1");

    

     Stage s2 =new Stage();

     //s2.initModality(Modality.APPLICATION_MODAL);

     s2.setTitle("s2");

     //设置s2和s1关联

     s1.initOwner(s2);

    

     s1.initModality(Modality.WINDOW_MODAL);

    

     s2.show();

     s1.show();

案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import javafx.application.Application;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.control.Label;

import javafx.scene.control.TextField;

import javafx.scene.layout.HBox;

import javafx.scene.layout.VBox;

import javafx.scene.transform.Scale;

import javafx.stage.Stage;


public class javafx03tage extends Application {

    public  static  Stage stage;


    @Override

    public void start(Stage stage) throws Exception {

        //让舞台赋值给静态属性

        javafx03tage.stage =stage;


        stage.setTitle("小应用测试");

        //创建布局

        HBox hbox = new HBox();

        //创建控件

        TextField textField = new TextField();

        Button button = new Button("确定");

        button.setOnAction((e)->{

            String a = textField.getText();


            System.out.println("输入的内容为:"+a);

        });

        Button regist = new Button("注册");

        //写法1

//        regist.setOnAction((e)->{

//            regis();

//        });

//        写法2

        regist.setOnAction(e->javafx03tage.regis());

        //将控件加入布局

        hbox.getChildren().addAll(textField,button,regist);

//        hbox.getChildren().add(textField);

//        hbox.getChildren().add(button);

        //将布局加入场景

        Scene scene = new Scene(hbox,300,200);

        //将场景放入舞台

        stage.setScene(scene);

        stage.show();

    }

    public static void regis(){

        //创建垂直布局

        VBox vbox = new VBox();

        //创建控件

        TextField t1 = new TextField();

        TextField t2 = new TextField();

        Button b1 = new Button("注册");

        vbox.getChildren().addAll(t1,t2,b1);

        Scene scene = new Scene(vbox,300,200);

        javafx03tage.stage.setScene(scene);

    }

    public static void main(String[] args) {

        launch();

    }

}

platform、screen类

Platform类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class platformcalss extends Application{

   public static void main(String[] args) {

     launch(args);

   }

   @Override

   public void start(Stage primaryStage) throws Exception {

     //设置为false,当窗口关闭,程序仍然运行,如要关闭则Platform.exit(); 若为true,窗口关闭,程序关闭

     //Platform.setImplicitExit(false);

     //是否支持3D效果

     boolean b = Platform.isSupported(ConditionalFeature.SCENE3D);

    

     Platform.runLater(new Runnable() {

        @Override

        public void run()

        {

           System.out.println("run方法里的线程名字:"+Thread.currentThread().getName());

           //可以在这里更新组件

        }

     });

   }

}

screen类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Screencalss extends Application{

   public static void main(String[] args) {

     launch(args);

   }

   @Override

   public void start(Stage primaryStage) throws Exception {

     //获取屏幕

     Screen screen = Screen.getPrimary();

     //获取屏幕全部宽度,高度

     Rectangle2D rec1= screen.getBounds();

     //获取可视范围的宽度,高度

     Rectangle2D rec2= screen.getVisualBounds();

     System.out.println(rec1.getWidth());

     System.out.println(rec2.getWidth());

     Platform.exit();

   }

}

Scene场景类

scene类电脑屏幕相关

查看电脑屏幕宽高
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Screen primary = Screen.getPrimary();

        double dpi = primary.getDpi();

        System.out.println("当前屏幕dpi:"+dpi);

        Rectangle2D rec1 = primary.getBounds();

        Rectangle2D rec2 = primary.getVisualBounds();

        System.out.println("----全部屏幕--------");

        System.out.println("左上角x:"+rec1.getMinX()+"左上角y"+rec1.getMinY());

        System.out.println("右下角x--"+ rec1.getMaxX()+"右下角y--"+ rec1.getMaxY());

        System.out.println("宽度:"+rec1.getWidth()+"高度"+rec1.getHeight());

        System.out.println("----可以看到的屏幕--------");

        System.out.println("左上角x:"+rec2.getMinX()+"左上角y"+rec2.getMinY());

        System.out.println("右下角x--"+ rec2.getMaxX()+"右下角y--"+ rec2.getMaxY());


        System.out.println("宽度:"+rec2.getWidth()+"高度"+rec2.getHeight());

给button设置图标

scene.setCursor(Cursor.HAND);//手,箭头啥的

Cursor CROSSHAIR 光标十字光标

Cursor . DEFAULT 光标默认值

Cursor DISAPPEAR 光标消失

Cursor CLOSED_HAND 光标闭合手

Contextmenudemo 上下文菜单演示

Cursor E _ RESIZE 光标E _ RESIZE

自定义图标

scene.setCursor(Cursor.cursor("img"));

从本地获取图片路径的方式

URL url = getClass().getClassLoader().getResource("icon/icon.png");

String oath = url.toExternalForm();

完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   @Override

    public void start(Stage primaryStage) throws Exception{

        Button button = new Button("按钮");

        button.setPrefHeight(100);

        button.setPrefWidth(300);

        URL url = getClass().getClassLoader().getResource("icon/icon.png");

        String path = url.toExternalForm();

        Group group = new Group(button);

        Scene scene = new Scene(group);


         scene.setCursor(Cursor.cursor(path));

        primaryStage.setTitle("javafx");

        primaryStage.setHeight(800);

        primaryStage.setWidth(800);

        primaryStage.setScene(scene);

        primaryStage.show();



    }


打开网页,运行到代码就执行打开的操作


 HostServices hostServices = getHostServices();


        hostServices.showDocument("https://www.baidu.com/");


platform类的使用

Platform.runLater-队列线程按照顺序执行


   Platform.runLater(new Runnable() {

                @Override

                public void run() {

                    System.out.println("stop()"+Thread.currentThread().getName());

                }


            });


ImplicitExit(false) 后台运行


  Platform.setImplicitExit(false);// 设置这个之后呢不执行stop方法了


        Platform.exit();//关闭 

检测平台支支不支持什么效果

Platform.isSupported(ConditionalFeature.SCENE3D)//三d效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void start(Stage stage) throws Exception {

    stage.setTitle("SceneDemo");

    HBox hbox =new HBox();

    Button button =new Button("打开百度");

    hbox.getChildren().add(button);

    button.setOnAction((e)->{

        HostServices hostServices = getHostServices();

        hostServices.showDocument("https://www.baidu.com/");

    });

    Scene scene =new Scene(hbox,400,500);

    scene.setCursor(Cursor.CLOSED_HAND);//手

    stage.setScene(scene);

    stage.show();

}

Group容器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stage.setTitle("GroupDemo");

              Group group =new Group();

              Button button =new Button("按钮");

              button.setLayoutX(50);

              button.setLayoutY(50);

              group.getChildren().add(button);

              //看位置是否有子节点

              boolean is =group.contains(0, 0);

              System.out.println("位置是否有子节点:"+is);

              //将所有的子节点放置object[]

              Object[] o= group.getChildren().toArray();

              System.out.println("多少个子节点:"+o.length);

              for (Object object : o) {

                     System.out.println(object);

              }

             

              group.getChildren().addListener(new ListChangeListener<Node>() {


                     @Override

                     public void onChanged(Change<? extends Node> c) {

                            //元素个数(当删除或增加时触发监听器)

                            System.out.println("当前子控件数量:"+c.getList().size());

                     }

              });

             

              Scene scene =new Scene(group);

              scene.setCursor(Cursor.CLOSED_HAND);

JAVAFX项目

Main.java主项目

Application.css样式

Build.fxbuild用于程序的打包发布

Icons图标、Pane窗格、Platform平台、addEventFilter添加事件筛选器、getCharacter获取字符、PRESSED按下pressed、TYPE打字,

getCode获取代码,

案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import javafx.application.Application;

import javafx.application.Platform;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.image.Image;

import javafx.scene.image.ImageView;

import javafx.scene.input.KeyEvent;

import javafx.scene.layout.BorderPane;

import javafx.stage.Stage;


import java.io.FileInputStream;


public class javafx05stage extends Application {

    @Override

    public void start(Stage stage) throws Exception {

        stage.setTitle("整卷");

        FileInputStream fileInputStream = new FileInputStream("F:\\IDEADemo\\hello\\Snipaste_2022-10-12_20-03-32.jpg");

        Image image = new Image(fileInputStream);

        stage.getIcons().add(image);

//        HBox hbox = new HBox();

//        Button button = new Button("确定");

//        hbox.getChildren().add(button);

        stage.setWidth(600);

        stage.setHeight(500);

        BorderPane borderPane = new BorderPane();

        FileInputStream fileInputStream1 = new FileInputStream("F:\\IDEADemo\\hello\\src\\Snipaste_2022-10-17_17-14-25.jpg");

        Image image1 = new Image(fileInputStream1,200,200,true,true);

        ImageView imageView = new ImageView(image1);

        borderPane.getChildren().add(imageView);

        Scene scene = new Scene(borderPane,500,300);

        //舞台的风格必须带上场景

        //stage.initStyle(StageStyle.UNDECORATED);

        stage.setScene(scene);

        //舞台事件

        stage.setOnCloseRequest((e)->{

            System.out.println("系统被关闭了");

        });

        //舞台键盘事件

        //ADWS上下左右

        stage.addEventFilter(KeyEvent.KEY_TYPED, e->{

            if (e.getCharacter().equalsIgnoreCase("A")){

                imageView.setTranslateX(imageView.getTranslateX()-10);

            }

            if (e.getCharacter().equalsIgnoreCase("D")){

                imageView.setTranslateX(imageView.getTranslateX()+10);

            }

            if (e.getCharacter().equalsIgnoreCase("W")){

                imageView.setTranslateY(imageView.getTranslateY()-10);

            }

            if (e.getCharacter().equalsIgnoreCase("S")){

                imageView.setTranslateY(imageView.getTranslateY()+10);

            }

        });

        //键盘按下:

        stage.addEventHandler(KeyEvent.KEY_PRESSED, e->{

            //ESC按下ESC,退出程序

            System.out.println(e.getCode().impl_getCode());

           if (27 == e.getCode().impl_getCode()){

               Platform.exit();

           };

        });

        stage.show();

    }

    public static void main(String[] args) {

        launch();

    }

}

Image

本地和网络图片

New Image(“file:c:/image/11.jpg”)

New Image(“https://img0.baidu.com/it/u=4119073184,4077902618&fm=253&fmt=auto&app=138&f=JPEG?w=442&h=267”)

File f =new File(“c:/image/11.jpg”);

String url =f.toURL().toString();

资源图片

与clas放在一起

Image image =new Image(“包名/11.jpg”);

案例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Imagedemo extends Application {

    Image[] images ={new Image("cat.jpeg"),new Image("cat1.jpeg"),new Image("cat2.jpeg")};

    static  int i = 0;

    ImageView imageView=new ImageView(images[i]);


    @Override

    public void start(Stage stage) throws Exception {

        stage.setTitle("imagedemo");

        Button button =new Button("下一个");


        BorderPane borderPane =new BorderPane();


        button.setOnAction(new EventHandler<ActionEvent>() {

            @Override

            public void handle(ActionEvent event) {

                i++;

                if (i>2) i=0;

                imageView.setImage(images[i]);

            }

        });


        borderPane.setTop(button);

        borderPane.setCenter(imageView);

        Scene scene =new Scene(borderPane,1200,800);

        stage.setScene(scene);

        stage.show();

    }


    public static void main(String[] args) {

        launch();

    }

}

javafx场景

TextField文本字段、Cursor光标、imageView图像视图、addEventHandler添加事件处理程序、KeyEvent键盘事件、MouseEvent鼠标事件、

BorderPane布局

​编辑

BorderPane布局顶部,底部,左,右或中心区域中的子节点。每个区域只能有一个节点。BorderPane的顶部和底部区域允许可调整大小的节点占用所有可用宽度。

左边界区域和右边界区域占据顶部和底部边界之间的可用垂直空间。

默认情况下,所有边界区域尊重子节点的首选宽度和高度。放置在顶部,底部,左侧,右侧和中心区域中的节点的默认对齐方式如下:

● 顶部: Pos.TOP_LEFT

● 底部: Pos.BOTTOM_LEFT

● 左侧: Pos.TOP_LEFT

● 右侧: Pos.TOP_RIGHT

● 中心: Pos.CENTER

案例:图片跟随鼠标移动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class javafx06stage extends Application {

    @Override

    public void start(Stage stage) throws Exception {

        stage.setTitle("场景测试");

        FileInputStream fileInputStream = new FileInputStream("F:\\IDEADemo\\hello\\src\\Snipaste_2022-10-17_17-14-25.jpg");

        Image image = new Image(fileInputStream,200,200,true,true);

        ImageView imageView =new ImageView(image);

        imageView.setTranslateX(150);

        imageView.setTranslateY(100);

        //BorderPane布局

        BorderPane borderPane =new BorderPane();

        borderPane.getChildren().addAll(imageView);

        //HBox hbox = new HBox();

//        VBox vbox = new VBox(10);

//        vbox.getChildren().addAll(new TextField(),new TextField(),new Button("确定"));

        //场景

        Scene scene = new Scene(borderPane,600,400);

        //场景鼠标光标

        scene.setCursor(Cursor.OPEN_HAND);

        stage.setScene(scene);

        //舞台事件

        stage.addEventFilter(MouseEvent.MOUSE_MOVED, e->{

            imageView.setTranslateX(e.getX()-100);

            imageView.setTranslateY(e.getY()-100);

        });

        stage.show();

    }

    public static void main(String[] args) {

        launch();

    }

}

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
Kubesphere DevOps组件 创建CI/CD流水线
DevOps 提供一系列持续集成 (CI) 和持续交付 (CD) 工具,可以使 IT 和软件开发团队之间的流程实现自动化。在 CI/CD 工作流中,每次集成都通过自动化构建来验证,包括编码、发布和测试,从而帮助开发者提前发现集成错误,团队也可以快速、安全、可靠地将内部软件交付到生产环境。
全栈研发知识库
2025/01/21
3360
.NET CORE WebAPI 通用 Deploy.yaml 文件
全栈研发知识库
2025/01/21
520
【K8S专栏】Kubernetes应用访问管理
在Kubernetes中,提供了Service和Ingress两种对象来实现应用间访问或外部对集群应用访问,这两种对象在实际的工作中会时长使用,非常重要的对象。
没有故事的陈师傅
2022/12/06
1.7K0
【K8S专栏】Kubernetes应用访问管理
ingress通过daemonSet,nodeSelector,hostNetwork方式部署
首先我们需要在k8s集群中准备边缘节点,用来部署ingress(需要对边缘节点打污点或者使用亲和性/反亲和性),如果是私有化部署,需要对ingress做高可用,如果资源充足,还可以再做一次负载均衡,这里在本地测试的话,直接在其中一个node上启动一个就可以了
dogfei
2020/08/19
4K0
linux skywalking k8s部署
调用链监控告警神器: git:https://github.com/apache/skywalking 实践: oap-server  deployment: apiVersion: apps/v1beta2 kind: Deployment metadata: annotations: deployment.kubernetes.io/revision: "14" description: skywalking-oap-server creationTimestamp: "2020
葫芦
2020/04/22
2.7K0
打造云原生大型分布式监控系统(三): Thanos 部署与实践
上一篇 Thanos 架构详解 我们深入理解了 thanos 的架构设计与实现原理,现在我们来聊聊实战,分享一下如何部署和使用 Thanos。
imroc
2020/04/20
6.3K5
K8s Deployment YAML 名词解释
Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义 (declarative) 方法,用来替代以前的 ReplicationController 更方便的管理应用。
YP小站
2020/06/04
5910
Kuberneters 搭建openLDAP
要安装一系列的工具 ,如:jenkins spinnaker gitlab。账号系统是一件烦人的事情。前两年自己也试过openladap这样的统一账号管理认证。现在就想再用一下.把几个软件的账户系统整合一下(主要是想上spinnaker了)。搭建方式基本参照:https://mutoulazy.github.io/2021/04/01/kubernetes/openLDAP/#%E5%9C%A8k8s%E4%B8%AD%E9%83%A8%E7%BD%B2。不过这个哥们写的配置文件也比较乱,起码的pv,pvc应该先创建吧?yaml顺序整的杂七乱八的都是创建了服务后导出的.....,另外还有这里两个的可以参考:Kubernetes - - k8s - v1.12.3 OpenLDAP统一认证kubernetes实战(十一):k8s使用openLDAP统一认证
对你无可奈何
2021/08/02
2K0
附020.Nginx-ingress部署及使用
[root@master01 ingress]# git clone https://github.com/nginxinc/kubernetes-ingress/
木二
2020/06/04
1.2K0
关于Kubernetes构建Redis集群
因为redis不支持主机名加入集群,你可以使用dig 命令将主机名解析成IP后,以解析结果为IP的方式加入。
Yuou
2022/09/26
7931
k8s部署之kubesphere安装以及使用
Docker-Compose下载路径:https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64
小炜同学
2022/09/23
4.6K0
TKE之Traefik最佳实践
k8s的接入层有很多种,常见的7层负载均衡有nginx-ingress、traefik、kong等,还有每个云厂商为了对接自己的负载均衡产品所开发的控制器,tke集群现在默认是clb类型ingress,也支持组件安装nginx-ingress到集群内使用,其他类型的网关,需要自己在集群内部署才行,今天我们讲讲traefik在tke上的部署安装和一些使用实践。
聂伟星
2022/03/18
2.5K0
istio 问题排查: GRPC 服务负载不均
grpc 调用,同一个 client 的请求始终只打到同一个 server 的 pod,造成负载不均。
imroc
2021/05/26
2.5K1
pushgateway on k8s 部署yaml
prom/pushgateway可以在hub.docker.io查到dockerfile文件及部署说明,启动参数--persistence.file等都是放入spec.args中添加即可生效; 所有启动参数:
笨兔儿
2019/05/26
2.5K0
你还在用YAML编排K8s吗?看看这篇吧
由于 YAML的局限,它是配置文件,不够灵活,所以我便写了这个程序,目前还没有进入 Release 阶段。等我用一段时间,稳定了,就会升级。
netkiller old
2021/10/20
4930
在k8s(kubernetes) 上安装 ingress V1.1.0
Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。流量路由由 Ingress 资源上定义的规则控制。
小陈运维
2021/12/16
1.6K0
Nginx-ingress controller部署
使用Nginx-ingress服务的前提是在集群内部署nginx-ingress controller,controller部署的nginx-install.yaml如下: apiVersion: v1 kind: Namespace metadata: name: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx --- kin
院长技术
2022/03/10
3K0
Kubernetes 部署 Compute storage coupled 模式 Doris 高可用集群实战指南
今天分享的主题是:如何在 k8s 集群上部署 Compute storage coupled(存算耦合) 模式的 Doris 高可用集群?
运维有术
2024/12/02
1950
Kubernetes 部署 Compute storage coupled 模式 Doris 高可用集群实战指南
prometheus监控安装使用
一、安装 1.1、创建CRD以及namespace # 官方地址:https://github.com/prometheus-operator/kube-prometheus # 下载对应版本安装包 https://github.com/prometheus-operator/kube-prometheus/tree/v0.10.0 ​ # 创建operator kubectl apply --server-side -f manifests/setup ​ 1.2、修改持久化配置 # 修改文件promet
堕落飞鸟
2022/06/07
6390
部署loki采集kubernetes容器日志
Grafana Loki is a set of components that can be composed into a fully featured logging stack. Unlike other logging systems, Loki is built around the idea of only indexing metadata about your logs: labels (just like Prometheus labels). Log data itself is then compressed and stored in chunks in object stores such as Amazon Simple Storage Service (S3) or Google Cloud Storage (GCS), or even locally on the filesystem. A small index and highly compressed chunks simplifies the operation and significantly lowers the cost of Loki.
锅总
2024/06/12
2720
部署loki采集kubernetes容器日志
推荐阅读
相关推荐
Kubesphere DevOps组件 创建CI/CD流水线
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档