JavaFX 基础

1.JavaFX应用的程序基本结构

窗口(stage):窗口里面可以设置场景,但是一次只能显示一个场景。

场景(scene):场景可以添加UI组件图的树形结构。

根节点(parent):根节点设置为一个布局,放置不同的节点(组件)。可以在根节点嵌套放置根节点。

生成与上图匹配的场景图的一种可能的实现如下。


public class HelloApp extends Application {

    private Parent createContent() {
        return new StackPane(new Text("Hello World"));
    }

    @Override
    public void start(Stage stage) throws Exception {
        stage.setScene(new Scene(createContent(), 300, 300));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

2、JavaFX应用的Application

执行顺序是 init() -> start() -> stop()

package sample;

import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class JavaFX1 extends Application {

    private Parent createContent() {
        return new StackPane(new Text("Hello World"));
    }
    //init方法执行后执行start方法
    @Override
    public void start(Stage stage) throws Exception {
        stage.setScene(new Scene(createContent(), 300, 300));
        stage.show();
    }

    @Override
    public void init() throws Exception {
        //程序启动,最先执行
        super.init();
    }

    @Override
    public void stop() throws Exception {
        //程序关闭,最后执行
        super.stop();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

 3、JavaFX应用的Stage

设置标题

//设置标题
stage.setTitle("hello");

设置图标

stage.getIcons().add(new Image("image/icon.png"));

窗口大小控制

//窗口大小控制:true大小可调,false不可调
stage.setResizable(true);

initStyle设置窗口样式,StageStyle窗口样式

stage.initStyle(StageStyle.DECORATED);  //默认样式

x,y,width,heigth坐标,宽,高

//设置位置
button1.setLayoutX(200);
button1.setLayoutY(200);
//设置宽高
stage.setWidth(400);
stage.setHeight(400);       

Modality窗口是否是模态的

stage1.initModality(Modality.APPLICATION_MODAL);  //应用模态(全局模态:点开一个子窗口只可在当前窗口操作)
//stage1.initModality(Modality.NONE);  //非模态(默认为非模态)
取消或重写操作系统默认退出事件
        //1.取消操作系统默认退出事件
        Platform.setImplicitExit(false);
        stage.setOnCloseRequest(event -> {
            //2.取消右上角的x关闭窗口事件
            event.consume();
            //3.创建一个弹窗
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
            alert.setTitle("退出");
            alert.setHeaderText(null);
            alert.setContentText("确认要退出!");
            Optional<ButtonType> result = alert.showAndWait();
            if (result.get() == ButtonType.OK) {
                //退出程序
                Platform.exit();
                //关闭窗口,不退出程序
                stage.close();
            }
        });

4、JavaFX应用的Scene

1、场景切换

public class JavaFx2 extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        //1编写第一个场景
        Button btn1 = new Button("第一个场景");
        btn1.setLayoutX(200);
        btn1.setLayoutY(200);
        AnchorPane anchorPane1 = new AnchorPane();
        anchorPane1.getChildren().add(btn1);
        Scene scene1 = new Scene(anchorPane1);

        //2编写第二个场景
        Button btn2 = new Button("第二个场景");
        btn2.setLayoutX(200);
        btn2.setLayoutY(200);
        AnchorPane anchorPane2 = new AnchorPane();
        anchorPane2.getChildren().add(btn2);
        Scene scene2 = new Scene(anchorPane2);

        //3.点击按钮,切换场景
        btn1.setOnAction(e -> {
            primaryStage.setScene(scene2);
        });

        btn2.setOnAction(e -> {
            primaryStage.setScene(scene1);
        });

        primaryStage.setScene(scene1);
        primaryStage.setWidth(400);
        primaryStage.setHeight(400);
        primaryStage.setTitle("场景切换");
        primaryStage.show();


    }
}

5、Node UI控件的通用属性


Node类是一个抽象类,所有控件的父类都是Node。以下简单介绍下常用的方法:

◆ layoutX / layoutY / preWidth / preHeight

◆ style / visible / opacity / blendMode

◆ tanslateX / tanslateY / rotate / scaleX / scaleY /scaleZ

 6、UI控件的属性绑定和属性监听

public class JavaFx3 extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("属性监听示例");

        //设置滑块
        Slider slider = new Slider();
        slider.setMin(0);
        slider.setMax(100);
        slider.setValue(50);
        slider.setOrientation(Orientation.HORIZONTAL);

        Label label = new Label();
        label.setText("滑块值: " + slider.getValue());

        //监听滑块值变化
        slider.valueProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                label.setText("滑块值: " + newValue);
            }
        });

        VBox vbox = new VBox(slider, label);
        Scene scene = new Scene(vbox, 200, 100);
        primaryStage.setScene(scene);

        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

监听效果图如下:

 

7、JavaFX应用里的事件驱动编程

1、键盘事件

public class JavaFx4 extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("键盘事件");

        Label label = new Label("你按下的键: ");
        StackPane root = new StackPane(label);

        root.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
                label.setText("你按下的键: " + event.getCode());
            }
        });

        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();

        // Request focus so keypresses can be handled
        root.requestFocus();
    }
}

在这个例子中,我们使用setOnKeyPressed方法来为Root StackPane添加了一个键盘事件处理程序,只要用户在应用程序窗口中按下任何键,系统就会打印出键的编码。

2.点击事件

public class JavaFx5 extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("点击事件");

        Label label = new Label("");
        label.setLayoutX(100);
        label.setLayoutY(200);
        Button btn = new Button();
        btn.setLayoutX(150);
        btn.setLayoutY(150);
        btn.setText("点我!");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                label.setText("你点击了按钮");
            }
        });

        AnchorPane root = new AnchorPane();
        root.getChildren().add(label);
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

8、FXML布局文件的使用

在学习FXML之前,我们的代码都是直接写在类里面的,比方实现一个点击按钮字体移动的效果,我们以前写的代码如下:

现在用FXML文件管理组件

1、主方法的start方法中加载fxml文件,并放置场景中

2、fxml文件的配置和Controller配置组件属性和事件方法

9、Scene Builder构建 fxml布局文件 

1、首先要下载 Scene Builder | JavaFX中文官方网站

2、Scene Builder的使用

2.1 安装好后,打开程序,先拖拽一个Containers下的AnchorPane进来

2.2 同上,我们可以往布局里面添加组件

 2.3 给组件设定事件,生成controller层代码 

 2.4 ctrl + s 保存到桌面,把fxml复制到idea项目中,写一个Controller,把生成的Controller复制到Controller中

2.5 在fxml中把controller路径配上

10、IDEA支持Scene Builder

在idea的Settings里面搜索javafx,设置安装SceneBuildert的安装路径,然后就可以在fxml文件中右键选择Open In SceneBuildert中直接打开软件,在软件内编辑完后保存,就可以直接更新fxml文件了

若此文档不够详细,可以参考JAVAFX基础入门_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古智云开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值