开发知识点-JAVA图形化-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();













Menu菜单

ContextMenu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值