JavaFX
ObservableList 接口
可观察的列表。在这种列表中,当其中的元素发生改变时,可以通知相关的观察者。
Contextmenu
弹出式菜单 按下鼠标右键时显示
可以与任何JavaFX节点(如按钮、标签、面板等)关联
MenuItem 选项项
有一个文本标签和一个可选的图标,当用户选择该选项时,可以执行与该选项相关的操作。
ChoiceBox
ComboBox
SelectionModel()
SelectionModel
是JavaFX中用于管理选中项的模型类
selectedItemProperty()对象
当前选中项的属性
addListener
getSelectedItem()
TabPane
TableView
JavaFX Scene Builder
css
<Label layoutX="151.0" layoutY="43.0" styleClass="cf-info-label-b" text="URL">
<stylesheets>
<URL value="@../../../css/core.css" />
<URL value="@../../../css/color.css" />
</stylesheets>
</Label>
https://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html#label
JavaFX通用漏洞利用工具开发从无到无
http://www.secist.com/archives/1152.html
https://www.cnblogs.com/kbhome/p/13073746.html
环境配置
- windows10/7
- IDE-vscode/IDEA
- JavaFX
JavaFX基本程序结构
窗口 为 stage类的实例表示
窗口内 可以设置 场景 – 并在窗口内 可以 切换 多个场景
但是 一次只能 显示 一个场景
场景内 可添加 组件图的树形结构
树的根节点是一个Parent子类
一般 设置根节点 为 布局 (不同组件节点) -左
也可以 内嵌 布局为节点 - 右
2017.3
Stage窗口
start默认带一个stage窗口
title stage.settitle
icon
在src同行创建 resources资源文件夹 image logo.png
右键复制其相对路径
primaryStage.getIcons().add(new Image("image/icon.png"));
resiziable 可改变大小 true默认 false 不可改变
primaryStage.setResizable(false);
x,y,weight,height
我们可以设置场景宽高
stagestyle 窗口样式
枚举类型 四个
primaryStage.initStyle(StageStyle.TRANSPARENT); 透明背景
primaryStage.initStyle(StageStyle.DECORATED); 系统默认
primaryStage.initStyle(StageStyle.UNDECORATED);没有标题栏图标
primaryStage.initStyle(StageStyle.UNIFIED);简单装饰
modality 窗口的模式
是否为模态多窗口 默认为可以自由点击
Stage stage =new Stage();
stage.setHeight(300);
stage.setWidth(500);
stage.initModality(Modality.NONE); 默认 非模态
stage.initModality(Modality.APPLICATION_MODAL); 全局模态
stage.initModality(Modality.WINDOW_MODAL); 需要父窗口 打开窗口 禁用父窗口
stage.initOwner(primaryStage); 设置父窗口
stage.show();
event 窗口事件
点击 最大化/关闭/键盘事件
监听关闭事件 需要把默认的关闭事件取消掉
// 当最后一个窗口关闭时是否自动退出应用程序
Platform.setImplicitExit(false);
primaryStage.setOnCloseRequest(e->{
e.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(); 关闭窗口 程序还在后台
}
});
鼠标箭头的形式
Button rightProxy = new Button("开启代理");
rightProxy.setLayoutX(10);
rightProxy.setLayoutY(20);
Scene scene = new Scene(pane,500,300);
scene.setCursor(new ImageCursor(new Image("image/cursor.png")));
Scene 场景类
new 一个场景 里面放 一个 树形结构的 组件
参数为: 树根节点,宽,高
再把 场景 加到 窗口里,可以切换场景(点击事件 切换场景)
Node抽象类 UI控件的通用属性
不能被实例化
所有控件的父类都是继承在这个node
用node的属性方法 用它的子类(所有组件都是继承node)
node类的通用属性(所有组件都有的属性)
-
坐标
-
宽高
-
样式 (居中) 显示visible、透明度opacity、混合模式blendMode(两个控件叠加 跟ps同理)
-
平移、旋转 rotate、三D旋转
-
包裹parent、场景scene、id(fx布局用到)
UI控件的属性绑定和属性监听
UI控件的绑定主要用Property这个接口
Node属性基本用的property接口子类的实例
甚少使用wrapped这个数据类型
有 Boolean、Integer、Long、String、object类封装
创建项目
new project
不选择 JavaFX(自动生成代码结构)
选择普通的项目
新建一个包
新建入口类(主类)
创建 psvm main入口方法
并继承抽象类Application
重写它的抽象类抽象方法 alt + enter
package com.aming.exp;
import javafx.application.Application;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
}
@Override
public void start(Stage primaryStage) throws Exception {
}
}
在入口函数 调用 application的静态方法 launch
它会自动调用start 并传递 Stage主窗口
package com.aming.exp;
import javafx.application.Application;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("AmingExp");
primaryStage.show();
}
}
默认 宽度高度 位置
布局
borderpane 布局
会把 场景 划分为 上下左右中
默认在中间
AnchorPane 布局容器
用于定位子节点
通过设置子节点的锚点来确定它们的位置和大小
每个子节点可以相对于父容器和其他节点的四个边缘(上、下、左、右)进行定位。
可以使用AnchorPane的静态方法
setTopAnchor(),setBottomAnchor(),setLeftAnchor(),setRightAnchor()来设置子节点相对于边缘的偏移量。
// // 将输入框和搜索按钮添加到顶部
// pane.setTop(dirTextField);
// pane.setRight(searchButton);
// // 将表格添加到中间
// pane.setCenter(table);
AnchorPane pane = new AnchorPane();
AnchorPane pane1 = new AnchorPane();
Scene scene = new Scene(pane,500,300);
Scene scene1 = new Scene(pane1,500,300);
primaryStage.setScene(scene);
pane.getChildren().addAll(dailiL,rightProxy);
pane1.getChildren().addAll(closeProxy);
rightProxy.setOnAction(e->{
primaryStage.setScene(scene1);
});
closeProxy.setOnAction(e->{
primaryStage.setScene(scene);
});
VBox布局容器
用于在垂直方向上放置和排列子节点。VBox按照子节点添加的顺序依次垂直排列它们
可以自动调整子节点的大小,以适应容器的宽度。你可以使用VBox的属性和方法来设置和控制子节点的布局和对齐方式。
以下是VBox常用的属性和方法:
spacing属性:用于设置子节点之间的间距(以像素为单位)。
alignment属性:用于设置子节点在垂直方向上的对齐方式。
可以使用常量Pos.TOP_LEFT、Pos.TOP_CENTER、Pos.TOP_RIGHT、Pos.CENTER_LEFT、Pos.CENTER、Pos.CENTER_RIGHT、Pos.BOTTOM_LEFT、Pos.BOTTOM_CENTER、Pos.BOTTOM_RIGHT来设置对齐方式。
setFillWidth()方法:用于设置子节点是否填充容器的宽度。
getChildren()方法:用于获取VBox中的子节点列表。
使用VBox可以轻松地实现垂直布局,例如在垂直方向上排列按钮、标签、文本框等界面元素。
// 创建一个垂直布局容器VBox作为主布局
VBox vbox = new VBox();
vbox.setPadding(new Insets(10));
vbox.setSpacing(10);
// 创建一个标签用于显示侧边栏标题
Label sidebarTitle = new Label("侧边栏");
vbox.getChildren().add(sidebarTitle);
HBox 容器
// 创建一个水平布局容器HBox作为标签和按钮的容器
HBox hbox = new HBox();
hbox.setSpacing(10);
// 创建一个文本框用于输入标签内容
TextField labelTextField = new TextField();
labelTextField.setPromptText("输入标签内容");
// 创建一个按钮用于添加标签
Button addButton = new Button("添加");
addButton.setOnAction(event -> {
String labelText = labelTextField.getText();
if (!labelText.isEmpty()) {
Label newLabel = new Label(labelText);
vbox.getChildren().add(newLabel);
labelTextField.clear();
}
});
// 创建一个按钮用于删除最后一个标签
Button deleteButton = new Button("删除");
deleteButton.setOnAction(event -> {
if (vbox.getChildren().size() > 1) {
vbox.getChildren().remove(vbox.getChildren().size() - 1);
}
});
hbox.getChildren().addAll(labelTextField, addButton, deleteButton);
vbox.getChildren().add(hbox);
TabPane
监听事件
// TAB 点击 监听事件
main_tabpane.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>() {
@Override
public void changed(ObservableValue<? extends Tab> observable, Tab oldValue, Tab newValue) {
}
});
跳转
main_tabpane.getSelectionModel().select(setting_tab);
JavaFX Scene Builder
配置JavaFX
JDK11以后就把JavaFX分离出来了,而vscode支持的是JDK11以后的版本。
就算你下的是JDK11以前的版本在vscode上也不能使用。
自行去下载JavaFX,(记住下载的JavaFX要与自己下载的JDK版本一致)
https://openjfx.cn/
点击下载,进入下载页面
选择符合自己操作系统和JDK版本的去下载
File—>点击settings—>Languages&Frameworks—>JavaFX
在Path to SceneBuilder 中填入下载好的SceneBuilder.exe文件。
创建fxml文件以及Controller类文件
fxml文件
FXML是一种以XML的格式表示JavaFX界面对象的文件,FXML文件中的每一个元素可以映射到JavaFX中的一个类,每个FXML元素的属性或者其子元素都可以映射为该对应JavaFXML类的属性.
onAction=“#hanldeButtonAction”
Controller类文件
用来绑定这个fxml文件用的,用于控制这个界面的一些操作,实现一些功能
test.fxml,点击Open In SceneBuilder
preview按钮可以预览我们当前设置好的界面
选择Show Sample Controller Skeleton,可以直接显示Controller类的代码骨架,特别方便!!
复制这段代码到我们之前创建的TestController类中就行了
可以通过sceneBuilder通过拖拉控件构建页面,controller通过id来获取相应控件
标签
label标签
新建标签
创建 布局
把标签 放到 布局里面
窗口里创建场景
把布局放进场景里
再把场景放到窗口
里
@Override
public void start(Stage primaryStage) throws Exception {
Label dailiL = new Label("代理");
BorderPane pane = new BorderPane(dailiL);
Scene scene = new Scene(pane,500,300);
primaryStage.setScene(scene);
primaryStage.setTitle("AmingExp");
primaryStage.show();
}
button 按钮
application获取主机服务
javafx buttonn
添加按钮点击事件
lambda表达式
默认浏览器中打开指定的URL
getHostServices()是一个方法,它返回了一个HostServices对象,该对象提供了一些与主机环境相关的服务,例如显示文档、打开链接等。showDocument()则是HostServices类中的一个方法,它接受一个字符串参数,表示要打开的URL地址。
@Override
public void start(Stage primaryStage) throws Exception {
Label dailiL = new Label("代理");
Button rightB = new Button("开启");
rightB.setOnAction(e->{
getHostServices().showDocument("http://www.baidu.com");
});
BorderPane pane = new BorderPane(rightB);
Scene scene = new Scene(pane,500,300);
primaryStage.setScene(scene);
primaryStage.setTitle("AmingExp");
primaryStage.show();
}
TableView表格
TableColumn类
setPrefWidth()方法
创建3个类(User类、MasterController类、JDBC类)和1个fxml文件。
https://blog.csdn.net/2201_75692232/article/details/134212955
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.SimpleIntegerProperty;
public class User {
//id,password,name,age,con_id为变量
private SimpleIntegerProperty id;
private SimpleStringProperty password;
private SimpleStringProperty name;
private SimpleIntegerProperty age;
//一进入该页面就会执行此方法
@FXML
public void initialize() throws Exception{
loadData();
}
//创建集合userList
ObservableList<User> userList = FXCollections.observableArrayList();
Alert 类
将文本设置为 databasePathTextField 的文本
TextInputDialog dialog = new TextInputDialog();
dialog.setTitle("输入框");
dialog.setHeaderText("请输入内容:");
// 等待用户输入并获取输入的内容
dialog.showAndWait().ifPresent(result -> {
// 在这里处理输入的内容,例如将其打印出来
System.out.println("输入内容为:" + result);
});
// List<String> subdirectories = getSubdirectoryNames(dirPath);
// for (String name : subdirectories) {
// System.out.println(name);
// }
// FileChooser fileChooser = new FileChooser();
// fileChooser.setTitle("选择文件");
// fileChooser.setInitialDirectory(new File("E:/code/Java_test/EXP"));
// fileChooser.setInitialFileName("exec_n0vv.db");
//
// File selectedFile = fileChooser.showOpenDialog(null);
// if (selectedFile != null && selectedFile.exists()) {
// System.out.println("文件存在");
// } else {
// System.out.println("文件不存在");
// }
// alert.initOwner(((Stage) event.getSource()).getScene().getWindow());
alert.showAndWait();
// 加载FXML文件
Parent pane = FXMLLoader.load(getClass().getResource("./ui/home.fxml"));
// 创建Scene和Stage
Scene scene = new Scene(pane);
// // 创建表格和表格数据
表格列对象fileNameCol
// TableColumn<String, String> fileNameCol = new TableColumn<>("File Name");
泛型类型是<String, String>
// table = new TableView<>();
// tableData = FXCollections.observableArrayList();
FXCollections工具类创建了一个可观察的列表tableData
// table.setItems(tableData);
// table.getColumns().add(fileNameCol);
// searchButton.setStyle("-fx-background-color: #8bddfe;-fx-border-color: blue;-fx-border-width: 3px");
// searchButton.setOnAction(new EventHandler<ActionEvent>() {
// @Override
// public void handle(ActionEvent event) {
//
//
// tableData.clear();
// tableData.addAll(yamlFiles);
// }
// });
// 通过 ID 获取 TextField
TextField myTextField = (TextField) scene.lookup("#nuclei_temp_dir");
Poc_tableView = (TableView) scene.lookup("#Poc_tableView");
if (myTextField != null) {
System.out.println("成功获取 TextField: " + myTextField.getText());
} else {
System.out.println("无法获取 TextField!");
}
dirPath = myTextField.getText();