欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > JaxaFx学习(一)

JaxaFx学习(一)

2024/12/31 1:15:20 来源:https://blog.csdn.net/dengfengling999/article/details/144468623  浏览:    关键词:JaxaFx学习(一)

目录:

(1)基本结构

(2)Application

(3)Stage窗口显示

(4)Scene场景切换

(5)UI控件通用属性

(6)UI控件属性绑定很属性监听

(7)事件驱动编程

(8)Color、Font、Image

(9)FXML布局文件

(10)Scene Builder构建fxml布局文件

(1)基本结构

 //入口函数调用lanch方法,launch会自动的调用start方法

 

(2)Application

Application有一个获取主机服务的方法:

调用它的showDocument给他一个网址:进行跳转

 

package org.example;import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;public class Main extends Application {public static void main(String[] args) {System.out.println("Hello world!");//入口函数调用lanch方法,launch会自动的调用start方法Application.launch(args);}@Overridepublic void init() throws Exception {super.init();//init可以做数据初始化的操作:建立数据库连接之类的,可以新建一个线程去连接数据库,跟start方法同步执行}@Overridepublic void start(Stage primaryStage) throws Exception {//窗口Stage//窗口是否可以改变大小primaryStage.setResizable(true);//设置窗口图标primaryStage.getIcons().add(new Image("images/logo.jpg"));//窗口样式primaryStage.initStyle(StageStyle.DECORATED);Label label=new Label("Hello");//标签Button button=new Button("跳转");BorderPane borderPane=new BorderPane(button);//把标签放到,布局里,BorderPane会把布局划分为上下左右中,加的标签默认放到中间//按钮点击事件button.setOnAction(e ->{getHostServices().showDocument("www.baidu.com");});//场景Scene scene=new Scene(borderPane,300,300);//布局放到场景里面primaryStage.setScene(scene);//场景放到窗口里primaryStage.setTitle("窗口");//标题primaryStage.show();}@Overridepublic void stop() throws Exception {super.stop();//做清理资源的操作}
}
 

 点击跳转:

(3)Stage窗口显示


package org.example;import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;import java.util.Optional;public class Stage0 extends Application {public static void main(String[] args) {System.out.println("Hello world!");//入口函数调用lanch方法,launch会自动的调用start方法Application.launch(args);}@Overridepublic void init() throws Exception {super.init();//init可以做数据初始化的操作:建立数据库连接之类的,可以新建一个线程去连接数据库,跟start方法同步执行}@Overridepublic void start(Stage primaryStage) throws Exception {//窗口Stage//窗口是否可以改变大小primaryStage.setResizable(true);//设置窗口图标primaryStage.getIcons().add(new Image("images/logo.jpg"));//窗口样式primaryStage.initStyle(StageStyle.DECORATED);Button button0=new Button("跳转");Button button1=new Button("跳转");button0.setLayoutX(200);button0.setLayoutY(200);button1.setLayoutX(200);button1.setLayoutY(250);//组件图,树形结构组件图AnchorPane anchorPane=new AnchorPane();anchorPane.getChildren().addAll(button0,button1);//按钮点击事件button0.setOnAction(e ->{//显示新窗口Stage stage=new javafx.stage.Stage();stage.setHeight(200);stage.setWidth(300);stage.initModality(Modality.WINDOW_MODAL);//none:非模态  APPLICATION_MODAL:模态其他窗口不能使用 WINDOW_MODAL:需要设置下父窗口,只有父窗口不能使用stage.initOwner(primaryStage);stage.setTitle("父模态窗口");stage.show();//显示新窗口});button1.setOnAction(e ->{Stage stage=new javafx.stage.Stage();stage.setHeight(200);//没有设置默认为非模态stage.initModality(Modality.NONE);stage.setWidth(300);stage.setTitle("非模态窗口");stage.show();});//取消系统默认退出事件Platform.setImplicitExit(false);primaryStage.setOnCloseRequest(event -> {event.consume();//关闭窗口的动作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();//退出程序primaryStage.close();//只是退出窗口,程序还在运行}});//场景Scene scene=new Scene(anchorPane,300,300);//布局放到场景里面primaryStage.setScene(scene);//场景放到窗口里primaryStage.setTitle("窗口");//标题primaryStage.show();}@Overridepublic void stop() throws Exception {super.stop();//做清理资源的操作}
}

点击第二个按钮:他是非模态的

点击第一个按钮:他是模态的,设置了父窗口模态 

 

非模态窗口此时是可以使用的

 (4)Scene场景切换


package org.example;import javafx.application.Application;
import javafx.scene.ImageCursor;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;public class Scene1 extends Application {public static void main(String[] args) {System.out.println("Hello world!");//入口函数调用lanch方法,launch会自动的调用start方法Application.launch(args);}@Overridepublic void init() throws Exception {super.init();//init可以做数据初始化的操作:建立数据库连接之类的,可以新建一个线程去连接数据库,跟start方法同步执行}@Overridepublic void start(Stage primaryStage) throws Exception {//窗口Stage//窗口是否可以改变大小primaryStage.setResizable(true);//设置窗口图标primaryStage.getIcons().add(new Image("images/logo.jpg"));//窗口样式primaryStage.initStyle(StageStyle.DECORATED);//Label label=new Label("Hello");//标签Button button0=new Button("跳转");button0.setLayoutX(200);button0.setLayoutY(200);AnchorPane anchorPane=new AnchorPane();//把标签放到,布局里,BorderPane会把布局划分为上下左右中,加的标签默认放到中间anchorPane.getChildren().addAll(button0);//场景Scene scene=new Scene(anchorPane,300,300);//布局放到场景里面Label label2=new Label("JavaFx");//标签Button button1=new Button("返回原场景");label2.setLayoutX(200);label2.setLayoutY(200);button1.setLayoutX(200);button1.setLayoutY(250);AnchorPane anchorPane1=new AnchorPane();anchorPane1.getChildren().addAll(button1,label2);//场景二Scene scene1=new Scene(anchorPane1,500,500);//设置鼠标箭头scene1.setCursor(new ImageCursor(new Image("images/logo.jpg")));//按钮点击事件button0.setOnAction(e ->{primaryStage.setScene(scene1);//切换场景});button1.setOnAction(e ->{primaryStage.setScene(scene);//切换场景});primaryStage.setScene(scene);//场景放到窗口里primaryStage.setTitle("窗口");//标题primaryStage.show();}@Overridepublic void stop() throws Exception {super.stop();//做清理资源的操作}
}

点击跳转:

点击返回就返回到了原场景

(5)UI控件通用属性

所有控件都继承父类Node ,你想用node里面的方法,只能用它的子类Button、CheckBox等等

package org.example;import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;/*** UI控件的通用属性**/
public class Node extends Application {public static void main(String[] args) {System.out.println("Hello world!");//入口函数调用lanch方法,launch会自动的调用start方法Application.launch(args);}@Overridepublic void start(Stage primaryStage) throws Exception {//窗口Stage//窗口是否可以改变大小primaryStage.setResizable(true);Label label=new Label("Hello");//标签//设置坐标label.setLayoutX(200);label.setLayoutY(200);//设置样式label.setStyle("-fx-background-color: red;-fx-border-color: blue;-fx-border-width:3px");//设置宽度label.setPrefWidth(200);label.setPrefHeight(50);//设置内容居中label.setAlignment(Pos.CENTER);//设置这个控件是否显示//label.setVisible(false);//设置控件透明度,半透明label.setOpacity(0.5);//设置旋转,旋转90度label.setRotate(90);//设置平移 x轴平移label.setTranslateX(60);label.setTranslateY(100);//parent:父节点 scene:场景AnchorPane anchorPane=new AnchorPane();anchorPane.getChildren().add(label);//场景Scene scene=new Scene(anchorPane,500,500);//布局放到场景里面primaryStage.setScene(scene);//场景放到窗口里primaryStage.setTitle("窗口");//标题primaryStage.show();}}

(6)UI控件属性绑定很属性监听

属性绑定使用的是Property这个接口,node里面使用的这个接口的一些子类实例

绑定解绑方法:第一个是单向绑定,第二个是双向绑定 

package org.example;import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;/*** UI控件的属性绑定和属性监听**/
public class Property extends Application {public static void main(String[] args) {System.out.println("Hello world!");//入口函数调用lanch方法,launch会自动的调用start方法Application.launch(args);}@Overridepublic void start(Stage primaryStage) throws Exception {//窗口Stage//窗口是否可以改变大小primaryStage.setResizable(true);AnchorPane anchorPane=new AnchorPane();Scene scene=new Scene(anchorPane,500,500);Circle circle=new Circle();//圆的x轴Y轴中心点位置circle.setCenterX(250);circle.setCenterY(250);circle.setRadius(100);//半径circle.setFill(Color.WHITE);//填充颜色circle.setStroke(Color.BLACK);//边框//设置属性绑定:中心点绑定到场景的宽度和高度,让这个圆随着场景的变化而变化circle.centerXProperty().bind(scene.widthProperty().divide(2));//圆的中心点对应场景的宽度除以2circle.centerYProperty().bind(scene.heightProperty().divide(2));//圆的中心点对应场景的高度除以2//设置监听器:中心点监听circle.centerXProperty().addListener(new ChangeListener<Number>() {@Overridepublic void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {System.out.println("x轴中心点,原来是:"+oldValue+" 现在是:"+newValue);}});anchorPane.getChildren().add(circle);primaryStage.setScene(scene);//设置场景primaryStage.setTitle("窗口");//标题primaryStage.show();}}

窗口大小变化,圆中心点也变化 

 

属性也进行了监听

(7)事件驱动编程

事件源:产生事件的控件,如Button

事件处理者:各式各样的EventHandler

  每个事件源都可以设置一个事件处理者对象,传一个事件对象,

事件对象:ActionEvent,包含很多 对事件相关的一系列对象、参数

有很多事件

每个应用程序都应该对用户的操作进行反应,对用户的操作产生的事件进行处理

package org.example;import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.*;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;import java.security.Key;/*** 绑定事件**/
public class Event extends Application {public static void main(String[] args) {System.out.println("Hello world!");//入口函数调用lanch方法,launch会自动的调用start方法Application.launch(args);}@Overridepublic void start(Stage primaryStage) throws Exception {//窗口Stage//窗口是否可以改变大小primaryStage.setResizable(true);//组件图,树形结构组件图AnchorPane anchorPane=new AnchorPane();//场景Scene scene=new Scene(anchorPane,500,500);//布局放到场景里面Label label=new Label("Hello");//标签label.setLayoutX(200);label.setLayoutY(200);Button button=new Button("向上移动");button.setLayoutX(300);button.setLayoutY(200);//设置事件:按钮点击标签向上移动5button.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent event) {label.setLayoutY(label.getLayoutY()-5);}});//设置键盘按下事件,可以设置控件,也可以设置给场景scene.setOnKeyPressed(new EventHandler<KeyEvent>() {@Overridepublic void handle(KeyEvent event) {KeyCode keyCode=event.getCode();//获取键盘键if (keyCode.equals(KeyCode.DOWN)){//向下箭头label.setLayoutY(label.getLayoutY()+5);}}});//拖拽事件:当拖拽文件到文本框上时,显示文件的相对路径TextField textField=new TextField();textField.setLayoutX(100);textField.setLayoutY(100);//拖拽到这上面是弹出textField.setOnDragOver(new EventHandler<DragEvent>() {@Overridepublic void handle(DragEvent event) {event.acceptTransferModes(TransferMode.ANY);//设置显示一个箭头}});//松开手时弹出textField.setOnDragDropped(event -> {Dragboard dragboard=event.getDragboard();//获取托盘if (dragboard.hasFiles()){String path=dragboard.getFiles().get(0).getAbsolutePath();//获取绝对路径textField.setText(path);//设置到文本框里面}});anchorPane.getChildren().addAll(label,button,textField);primaryStage.setScene(scene);//场景放到窗口里primaryStage.setTitle("窗口");//标题primaryStage.show();}}

 

点击按钮:

按键盘向下的箭头:

移动一个文件:获取地址

(8)Color、Font、Image

Color:有好多种使用方法 

 color的静态常量

 

package org.example;import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.stage.Stage;/*** 字体、颜色、图片**/
public class ColorFontImage extends Application {public static void main(String[] args) {System.out.println("Hello world!");//入口函数调用lanch方法,launch会自动的调用start方法Application.launch(args);}@Overridepublic void start(Stage primaryStage) throws Exception {//窗口Stage//窗口是否可以改变大小primaryStage.setResizable(true);//组件图,树形结构组件图AnchorPane anchorPane=new AnchorPane();Scene scene=new Scene(anchorPane,500,500);Circle circle=new Circle();//圆的x轴Y轴中心点位置circle.setCenterX(250);circle.setCenterY(250);circle.setRadius(100);//半径//设置填充色//circle.setFill(Color.rgb(255,0,0));circle.setFill(Color.web("#f66a08"));//设置边框circle.setStroke(Color.BLUE);circle.setStrokeWidth(10);//边框宽度//字体Label label=new Label("你好");label.setLayoutX(100);label.setLayoutY(100);//label.setFont(new Font(30));label.setFont(Font.font("今天想你到这里", FontWeight.BOLD,30));//图片ImageView imageView=new ImageView();//图片放到里面Image image=new Image("images/logo.jpg");imageView.setImage(image);anchorPane.getChildren().addAll(imageView,circle);primaryStage.setScene(scene);//设置场景primaryStage.setTitle("窗口");//标题primaryStage.show();}}

(9)FXML布局文件

使用fxml文件代理在start里面控件和代码 

package org.example;import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;/*** fxml的运用:现实视图、控制器、java代码就实现了分离,主进程里面的代码会非常简介**/
public class fxml extends Application {public static void main(String[] args) {System.out.println("Hello world!");//入口函数调用lanch方法,launch会自动的调用start方法Application.launch(args);}@Overridepublic void start(Stage primaryStage) throws Exception {//窗口Stage//窗口是否可以改变大小primaryStage.setResizable(true);/* //字体Label label=new Label("你好");label.setLayoutX(150);label.setLayoutY(200);Button button=new Button("向上移动");button.setLayoutX(150);button.setLayoutY(260);//设置事件:按钮点击标签向上移动5button.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent event) {label.setLayoutY(label.getLayoutY()-5);}});//组件图,树形结构组件图AnchorPane anchorPane=new AnchorPane();anchorPane.getChildren().addAll(label,button);*///使用fxml的布局,进行引入fxmlPane anchorPane= FXMLLoader.load(getClass().getResource("/fxml/buttonLabel.fxml"));Scene scene=new Scene(anchorPane,500,500);primaryStage.setScene(scene);//设置场景primaryStage.setTitle("窗口");//标题primaryStage.show();}}

控件实例: 

<?xml version="1.0" encoding="UTF-8"?><?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?><?import javafx.scene.text.Font?>
<AnchorPane xmlns="http://javafx.com/javafx"xmlns:fx="http://javafx.com/fxml"fx:controller="org.example.controller.buttonLabelController"prefHeight="400.0" prefWidth="600.0"><!--children:变量是一个容器里面装了两个节点label、button--><children><!--label标签的类名作为标签名  如果想在controller中使用label需要设置一个id--><Label fx:id="la" text="你好" layoutX="150" layoutY="200"><!--给label设置字体,设置的是font对象类型,必须设置子标签的形式--><font><Font size="30"></Font></font></Label><!--设置点击事件 :#onUp会调用controller中的方法--><Button fx:id="bu" text="向上移动" layoutX="150" layoutY="260" onAction="#onUp"></Button></children></AnchorPane>

创建视图的控制器,编写功能代码:

package org.example.controller;import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;public class buttonLabelController {@FXMLLabel la;@FXMLButton bu;public void onUp(ActionEvent event){la.setLayoutY(la.getLayoutY() -5);}}

 

fxml的运用:现实视图、控制器、java代码就实现了分离,主启动类里面的代码会非常简介

(10)Scene Builder构建fxml布局文件

他可以实现以拖拽的方式创建fxml文件

拖拽这个布局 

布局属性 

Code跟controller的代码有关 

 

生成代码:

 生成一个controller:

保存fxml:

 把生成的fxml的放进创建的这个项目,更改加载

 

设置一下controller

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com