javaFX学习笔记
0.前言
上一次做javaFX的项目还是在一年前,最近实习要做java的相关项目,于是重新捡起,并以本文记录之。
1.配置环境(apt包管理系列,如ubuntu)
>>0.安装jre和jdk
网上配置的java环境的办法本人觉得繁琐,所以换个方便的法子
在终端搜索jdk
1 | sudo apt search jdk |
在这儿我选择的是14的版本
1 | sudo apt install openjdk-14-jdk && sudo apt install openjdk-14-jre |
然后就是安装JavaFx的scene Builder
需要在官网下载安装包,下载地址
下载javafx,地址
然鹅!!!我在配置的时候出现的示例项目无法运行问题。🤔🤔🤔经过一番查找,查考这篇博客后解决了问题。当然了,你可以先试着下文的测试环境,如果出现了问题,在回头处理一下。
顺便也安装一下scene Builder吧,客户端的界面可以直接拖拽出来,写好事件处理即可。
下载得到的是deb包。安装方式同下文安住方式
安装完成后,环境变量就自动配置好了。
>>1.开发工具idea
idea是jetbrian旗下著名的一款产品,用来写java的项目是非常得舒服的。所以,这儿建议使用idea。官网上有社区版本,地址如下:
安装:
1 | sudo dpkg -i 下载到的安装包.deb |
ps: 如果不只是写java项目的话,可以下载jetbrian官网的ToolBox,下载安装各类语言的IDE都是非常方便的。
>>2.测试环境
测试一下我们上述的安装有没有出现问题
打开IDEA
探测到java14说明上述安装没有出现问题。
下面就是新建项目了
2.新建项目
项目名的话,就根据自己的需要命名辣~
>>0.hello world
毕竟很久没碰了,还是从hello world来找找感觉😅
如果是新建的默认的如上图的javaFX项目的话,那你打开就会有个hello world的项目。效果如下图:
当然辣,如果出现问题无法运行的话,在开发工具那一小节后,有解决办法。希望可以解决你的问题🤪🤪🤪
3.配置数据库
本次的小作业呢,要求做一个带数据库的登陆界面。数据库的话,本文采用的是mysql
下载到是一个deb包,直接dpkg安装就ok辣
呸呸呸,翻车截图如下
配置数据的时候遇到了莫名奇妙的bug…折腾了半天没解决的了。亏我还在docker里部署mysql(不是不想直接在电脑上装,而是……..坑爹的mysql忘记了密码,网上的方法试过了,无效,想装一个mysql的替代品mariaDB,结果因为依赖问题装不了,mysql卸载又卸不掉😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭😭,于是便换个策略,将docker的3306端口映射到本机3306)
我淦😭😭😭
mysql的驱动会有报错
4.数据库的临时替代
数据连接不了,小作业还得做呀……于是采用了一个并不推荐的解决办法(我应急用的….😅😅😅)
也就是在程序里写定一组用户名和用户密码。
5.javafx里main,controller,fxml之间的通信
虽然数据库那边翻车了,但是javafx的相关内容还是可以在弄的。
以本文的为例
Main:
1 | package sample; |
大致的流程如下:root导入fmxl的布局文件(javafx的布局文件,可以通过官方推荐的Scene Builder直接拖拽生成),然后在Stage上添加Scene,最后通过show的方法现实出来。
Controller:
1 | package sample; |
上面代码中,包含了我试图连接数据库,并执行相关操作的目的。需要注意的事,文中加@FXML修饰的变量
1 |
|
此处加@FXML修饰符,为了对应由Scene Builder生成的fxml相关组件进行操作。
如本文登陆的界面的fxml为例
1 | <?import javafx.scene.control.Label?> |
发现有两个label用于提示输入用户名和密码,有一个TextField的组件,用来接收用户名,注意观察我们发现,在这个TextField中有有一个id=”usr”,对应上文的Controller中的那个FXML修饰符。在Controller中可以直接通过usr.getText()来获取用户的输入。下面的PassWordField也是同理。有两个Button组建,需要注意的是在Button标签后有OnAction,这是按钮点击后的事件处理函数,即是Controller中定义的方法。除了这些组建,还需要注意的是第一个Pane标签里的fx:controller,这是用来引用事件处理函数所在的Controller。如此处的Sample包中的LoginController。
Main,Controller,fxml三者之间的关系大致上就是这样子的。
6.整个项目
整个项目的结构
.
├── out
│ └── production
│ ├── JavaFxApplication
│ │ └── sample
│ │ └── sample.fxml
│ └── test
│ ├── META-INF
│ │ └── test.kotlin_module
│ └── sample
│ ├── LoginController.class
│ ├── LoginFailController.class
│ ├── loginFail.fxml
│ ├── login.fxml
│ ├── LoginSussController.class
│ ├── loginSuss.fxml
│ └── Main.class
├── src
│ └── sample
│ ├── LoginController.java
│ ├── LoginFailController.java
│ ├── loginFail.fxml
│ ├── login.fxml
│ ├── LoginSussController.java
│ ├── loginSuss.fxml
│ └── Main.java
└── test.iml
项目源码
LoginController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 package sample;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.stage.Stage;
import javafx.scene.control.TextField;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.PasswordField;
public class LoginController {
TextField usr;
PasswordField psw;
//
// public String driver = "com.mysql.jdbc.Driver" ; // 驱动
// public String url = "jdbc:mysql://localhost:3306/loginData" ;// 定义URL
// String user_T = (String) usr.getText();
// String password = psw.getText().toString();
//
// private Connection connection ;// 用于建立连接
// private PreparedStatement preStatement = null;
// private ResultSet resultSet = null;
protected void longinEvent(ActionEvent event) throws Exception{
String USER="admin";
String PSW="123456";
if (usr.getText().equals(USER) & psw.getText().equals(PSW)){
Parent Operation_Parent = FXMLLoader.load(getClass().getResource("loginSuss.fxml"));
Scene Operation_Creating_Scene = new Scene(Operation_Parent);
Stage CreateOperation_Stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
CreateOperation_Stage.hide();
CreateOperation_Stage.setScene(Operation_Creating_Scene);
CreateOperation_Stage.show();
}
else {
Parent Operation_Parent = FXMLLoader.load(getClass().getResource("loginFail.fxml"));
Scene Operation_Creating_Scene = new Scene(Operation_Parent);
Stage CreateOperation_Stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
CreateOperation_Stage.hide();
CreateOperation_Stage.setScene(Operation_Creating_Scene);
CreateOperation_Stage.show();
}
// String sql = String.format("select usr_psw from usr where usr_id=\"%s\"", usr.getText());
// try {
// Class.forName("com.mysql.jdbc.Driver");
// connection = DriverManager.getConnection(url, "root", "123456");
// preStatement = connection.prepareStatement(sql);
// resultSet = preStatement.executeQuery();
//
// while (resultSet.next()){
// if (resultSet.getString("usr_id") == usr.getText() && resultSet.getString("usr_psw") == psw.getText()){
// Parent Operation_Parent = FXMLLoader.load(getClass().getResource("loginSuss.fxml"));
// Scene Operation_Creating_Scene = new Scene(Operation_Parent);
// Stage CreateOperation_Stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
// CreateOperation_Stage.hide();
// CreateOperation_Stage.setScene(Operation_Creating_Scene);
// CreateOperation_Stage.show();
// }
// else {
// Parent Operation_Parent = FXMLLoader.load(getClass().getResource("loginFail.fxml"));
// Scene Operation_Creating_Scene = new Scene(Operation_Parent);
// Stage CreateOperation_Stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
// CreateOperation_Stage.hide();
// CreateOperation_Stage.setScene(Operation_Creating_Scene);
// CreateOperation_Stage.show();
// }
// }
// }catch (SQLException e) {
// e.printStackTrace();
// }
}
protected void exitSys(ActionEvent event) throws Exception{
// System.out.println(usr.getText());
// System.out.println(psw.getText());
System.exit(0);
}
}
LoginFailController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 package sample;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.stage.Stage;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
public class LoginFailController {
protected void ReLogin(ActionEvent event) throws Exception{
Parent Operation_Parent = FXMLLoader.load(getClass().getResource("login.fxml"));
Scene Operation_Creating_Scene = new Scene(Operation_Parent);
Stage CreateOperation_Stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
CreateOperation_Stage.hide();
CreateOperation_Stage.setScene(Operation_Creating_Scene);
CreateOperation_Stage.show();
}
protected void FailExitSys(ActionEvent event) throws Exception{
// System.out.println(usr.getText());
// System.out.println(psw.getText());
System.exit(0);
}
}
loginFail.fxml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.LoginFailController">
<children>
<Text layoutX="179.0" layoutY="67.0" strokeType="OUTSIDE" strokeWidth="0.0" text="一个简单的登陆失败界面" wrappingWidth="242.0">
<font>
<Font size="20.0" />
</font>
</Text>
<Text layoutX="154.0" layoutY="163.0" strokeType="OUTSIDE" strokeWidth="0.0" text="哎呀,登陆失败辣😩" wrappingWidth="292.0">
<font>
<Font size="31.0" />
</font>
</Text>
<Button layoutX="145.0" layoutY="226.0" mnemonicParsing="false" prefHeight="49.0" prefWidth="101.0" text="退出系统" onAction="#FailExitSys"/>
<Button layoutX="326.0" layoutY="226.0" mnemonicParsing="false" prefHeight="49.0" prefWidth="101.0" text="重新登陆" onAction="#ReLogin"/>
</children>
</Pane>
login.fxml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<Pane accessibleText="qing" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.LoginController">
<children>
<Label layoutX="117.0" layoutY="104.0" prefHeight="33.0" prefWidth="66.0" text="用户名:" />
<Label layoutX="117.0" layoutY="178.0" prefHeight="22.0" prefWidth="66.0" text="密码:" />
<TextField id="usr" fx:id="usr" layoutX="205.0" layoutY="104.0" prefHeight="33.0" prefWidth="259.0" promptText="请输入用户名" />
<Text layoutX="212.0" layoutY="71.0" strokeType="OUTSIDE" strokeWidth="0.0" text="一个简单的登陆界面" wrappingWidth="183.0">
<font>
<Font size="20.0" />
</font>
</Text>
<Button id="login" layoutX="353.0" layoutY="253.0" mnemonicParsing="false" prefHeight="51.0" prefWidth="111.0" text="点我登陆" onAction="#longinEvent"/>
<Button id="exit" layoutX="117.0" layoutY="253.0" mnemonicParsing="false" prefHeight="51.0" prefWidth="111.0" text="退出系统" onAction="#exitSys"/>
<PasswordField fx:id="psw" layoutX="205.0" layoutY="173.0" prefHeight="33.0" prefWidth="259.0" promptText="请输入密码" />
</children>
</Pane>
LoginSussController.class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package sample;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.stage.Stage;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
public class LoginSussController {
protected void RetureMain(ActionEvent event) throws Exception{
Parent Operation_Parent = FXMLLoader.load(getClass().getResource("login.fxml"));
Scene Operation_Creating_Scene = new Scene(Operation_Parent);
Stage CreateOperation_Stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
CreateOperation_Stage.hide();
CreateOperation_Stage.setScene(Operation_Creating_Scene);
CreateOperation_Stage.show();
}
protected void SussExitSys(ActionEvent event) throws Exception{
System.exit(0);
}
}
loginSuss.fxml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.LoginSussController">
<children>
<Text layoutX="180.0" layoutY="65.0" strokeType="OUTSIDE" strokeWidth="0.0" text="一个简单的登陆返回界面" wrappingWidth="240.0">
<font>
<Font size="20.0" />
</font>
</Text>
<Text layoutX="204.0" layoutY="159.0" strokeType="OUTSIDE" strokeWidth="0.0" text="登入成功辣😅" wrappingWidth="193.0">
<font>
<Font size="29.0" />
</font>
</Text>
<Button fx:id="success_exit" layoutX="152.0" layoutY="254.0" mnemonicParsing="false" prefHeight="52.0" prefWidth="107.0" text="退出系统" onAction="#SussExitSys"/>
<Button fx:id="succes_relogin_button" layoutX="313.0" layoutY="254.0" mnemonicParsing="false" prefHeight="52.0" prefWidth="107.0" text="重新登陆" onAction="#RetureMain"/>
</children>
</Pane>
Main.class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("login.fxml"));
primaryStage.setTitle("简单的登陆系统");
primaryStage.setScene(new Scene(root, 600, 400));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
7.效果图
首界面
登陆成功界面
登陆失败界面
到这儿本文就结束辣~,如文章中有不足之处,欢迎大佬留言斧正!
版权声明:转载请注明出处!
文章说明: 文章如有不足或者纰漏之处,欢迎留言斧正!