JavaFX 常见UI控件使用
UI 控件介绍
JavaFX 提供了一套丰富的用户界面控件,这些控件可以用来创建现代的、交互式的图形用户界面(GUI)。JavaFX 控件是 JavaFX 库中预定义的组件,它们封装了创建用户界面元素的复杂性,使得开发者可以快速地构建应用程序界面。
以下是一些常见的 JavaFX 控件:
| 控件名 | 说明 | 
|---|---|
| Label | 标签 | 
| Button | 按钮 | 
| RadioButton | 单选按钮(按组使用,具有互斥性) | 
| ToggleButton | 切换按钮(单独使用,可切换为选中或未选中状态) | 
| CheckBox | 复选框 | 
| ChoiceBox | 下拉框(不可编辑) | 
| ComboBox | 下拉框(可编辑) | 
| TextField | 文本输入框(单行) | 
| TextArea | 文本输入框(多行) | 
| Password Field | 密码输入框 | 
| Progress Bar | 进度条(显示任务进度的条形图) | 
| Progress Indicator | 进度指示器 | 
| Separator | 分割线 | 
| Slider | 滑块(允许用户通过滑动选择一个值的范围) | 
| List View | 列表视图 | 
| Table View | 表格视图 | 
| Pagination Control | 分页控制器 | 
| Tree View | 树视图 | 
| Tree Table View | 树表视图 | 
| Image View | 图片视图 | 
| MenuBar | 菜单栏(包含菜单项) | 
| MenuItem | 菜单项(用户可以点击执行操作) | 
| Dialog | 弹出窗口(用于创建模态框) | 
| Hyperlink | 超链接 | 
| Tooltip | 提示 | 
| HTML Editor | HTML编辑器 | 
| AccordionMenu | 手风琴菜单 | 
| Color Picker | 颜色选取器 | 
| Date Picker | 日期选择器 | 
| File Chooser | 文件选择器 | 
UI 控件使用
RadioButton(单选按钮)
它允许用户从一组选项中选择一个。每个 RadioButton 通常表示一个选项,并且这些 RadioButton 通常被组织在一个 ToggleGroup 中,以确保一次只能选择一个选项。
案例演示
package com.binge.javafxdemo.component;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.RadioButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class RadioButtonExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 创建一个 ToggleGroup 来管理 RadioButton
        ToggleGroup group = new ToggleGroup();
        // 创建 RadioButton
        RadioButton option1 = new RadioButton("Option 1");
        RadioButton option2 = new RadioButton("Option 2");
        RadioButton option3 = new RadioButton("Option 3");
        // 将 RadioButton 添加到 ToggleGroup
        option1.setToggleGroup(group);
        option2.setToggleGroup(group);
        option3.setToggleGroup(group);
        // 创建一个 Label 用于显示选中的选项
        Label selectedOptionLabel = new Label("No option selected");
        // 创建一个 VBox 作为布局容器
        VBox vbox = new VBox(10); // 间距为 10
        vbox.getChildren().addAll(option1, option2, option3, selectedOptionLabel);
        // 设置场景
        Scene scene = new Scene(vbox, 300, 200);
        // 设置舞台(窗口)并显示
        primaryStage.setTitle("RadioButton Example");
        primaryStage.setScene(scene);
        primaryStage.show();
        // 监听 RadioButton 选中事件
        group.selectedToggleProperty().addListener((obs, oldToggle, newToggle) -> {
            if (newToggle != null) {
                selectedOptionLabel.setText(((RadioButton) newToggle).getText());
            }
        });
    }
    public static void main(String[] args) {
        launch(args);
    }
}
CheckBox(复选框)
它提供了一个复选框,允许用户选择或取消选择一个选项。与 RadioButton 不同,CheckBox 通常用于允许用户选择多个选项,而不是从一组互斥选项中选择一个
案例演示
package com.binge.javafxdemo.component;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/**
 * CheckBox 示例
 */
public class CheckBoxExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 创建 CheckBox 控件
        CheckBox checkBox1 = new CheckBox("Option 1");
        CheckBox checkBox2 = new CheckBox("Option 2");
        CheckBox checkBox3 = new CheckBox("Option 3");
        // 创建布局并添加 CheckBox 控件
        VBox vbox = new VBox(10); // 间距为 10
        vbox.getChildren().addAll(checkBox1, checkBox2, checkBox3);
        // 创建场景并设置舞台
        Scene scene = new Scene(vbox, 200, 150);
        primaryStage.setTitle("CheckBox Demo");
        primaryStage.setScene(scene);
        primaryStage.show();
        // 监听 CheckBox 选中事件
        checkBox1.selectedProperty().addListener((obs, oldValue, newValue) ->
                System.out.println("Option 1 is now " + (newValue ? "selected" : "deselected")));
    }
    public static void main(String[] args) {
        launch(args);
    }
}
ComboBox(下拉框)
它结合了下拉列表和文本输入框的功能,允许用户从预定义的选项列表中选择一个选项,或者输入自定义值(如果启用了编辑功能)
案例演示
package com.binge.javafxdemo.component;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ComboBoxExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 创建 ComboBox
        ComboBox<String> comboBox = new ComboBox<>();
        // 创建选项列表
        ObservableList<String> options = FXCollections.observableArrayList(
            "Option 1", "Option 2", "Option 3", "Option 4"
        );
        comboBox.setItems(options);
        // 设置为可编辑
        //        comboBox.setEditable(true);
        // 监听选中值变化
        comboBox.valueProperty().addListener((obs, oldVal, newVal) -> {
            System.out.println("Selected Value: " + newVal);
        });
        // 创建布局并添加 ComboBox
        VBox vbox = new VBox(10); // 间距为 10
        vbox.getChildren().add(comboBox);
        // 创建场景并设置舞台
        Scene scene = new Scene(vbox, 300, 200);
        primaryStage.setTitle("ComboBox Demo");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}
TextField(文本输入框)
用于输入和编辑单行文本
案例演示
package com.binge.javafxdemo.component;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/**
 * TextField 示例
 */
public class TextFieldExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 创建 TextField 控件
        TextField textField = new TextField();
        // 设置初始文本
        textField.setText("Initial text");
        // 设置最大长度
        textField.setMaxWidth(200);
        // 添加文本更改监听器
        textField.textProperty().addListener((obs, oldText, newText) -> {
            System.out.println("Text changed to: " + newText);
        });
        // 创建布局并添加 TextField
        VBox vbox = new VBox(10); // 间距为 10
        vbox.getChildren().add(textField);
        // 创建场景并设置舞台
        Scene scene = new Scene(vbox, 300, 100);
        primaryStage.setTitle("TextField Demo");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}
List View(列表视图)
用于显示一列可选项目。用户可以通过它选择一个或多个项目,取决于 ListView 的设置
package com.binge.javafxdemo.component;
/**
 * @author binge
 * @Description
 * @date 2024年05月31日 上午 10:08
 */
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/**
 * ListView 示例
 */
public class ListViewExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 创建 ListView
        ListView<String> listView = new ListView<>();
        // 创建项目列表
        ObservableList<String> items = FXCollections.observableArrayList(
            "Apple", "Banana", "Cherry", "Date", "Elderberry"
        );
        listView.setItems(items);
        // 设置为多选模式
        listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        // 监听选中项变化
        listView.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
            System.out.println("Selected item: " + newSelection);
        });
        // 创建布局并添加 ListView
        VBox vbox = new VBox(10); // 间距为 10
        vbox.getChildren().add(listView);
        // 创建场景并设置舞台
        Scene scene = new Scene(vbox, 300, 200);
        primaryStage.setTitle("ListView Demo");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}
Table View(表格视图)
用于显示表格
案例演示
package com.binge.javafxdemo.component;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
/**
 * TableView 表格示例
 */
public class TableViewExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 创建 TableView
        TableView<Person> tableView = new TableView<>();
        // 创建数据列
        TableColumn<Person, String> nameColumn = new TableColumn<>("姓名");
        nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
        TableColumn<Person, Integer> ageColumn = new TableColumn<>("年龄");
        ageColumn.setCellValueFactory(new PropertyValueFactory<>("age"));
        // 添加列到 TableView
        tableView.getColumns().addAll(nameColumn, ageColumn);
        // 创建示例数据
        ObservableList<Person> data = FXCollections.observableArrayList(
                new Person("张三", 28),
                new Person("李四", 34),
                new Person("王五", 22)
        );
        // 设置 TableView 的数据
        tableView.setItems(data);
        // 创建场景并设置舞台
        Scene scene = new Scene(tableView, 400, 300);
        primaryStage.setTitle("TableView 示例");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    // 简单的 Person 类用于表格数据
    public static class Person {
        private String name;
        private Integer age;
        public Person(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public Integer getAge() {
            return age;
        }
    }
    public static void main(String[] args) {
        launch(args);
    }
}
当表格显示数据太多,建议表格带分页(Pagination Control 分页控制器)功能
案例演示
package com.binge.javafxdemo.component;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Pagination;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import javafx.scene.layout.VBox;
public class TableViewWithPaginationExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 创建数据
        ObservableList<User> users = FXCollections.observableArrayList(
                new User("Alice", 24),
                new User("Bob", 30),
                new User("Charlie", 18),
                new User("David", 22),
                new User("Emily", 26),
                new User("Frank", 32),
                new User("Grace", 28),
                new User("Henry", 20),
                new User("Isabella", 25),
                new User("Jack", 29),
                new User("Kevin", 21)
                // 添加更多用户...
        );
        // 创建分页控件
        Pagination pagination = new Pagination((int) Math.ceil((double) users.size() / 5), 0);
        pagination.setPageFactory((pageIndex) -> createPage(users, pageIndex));
        // 创建布局容器
        VBox vbox = new VBox(pagination);
        // 创建场景并设置舞台
        Scene scene = new Scene(vbox, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.setTitle("JavaFX TableView with Pagination");
        primaryStage.show();
    }
    private VBox createPage(ObservableList<User> users, int pageIndex) {
        // 创建表格
        TableView<User> tableView = new TableView<>();
        TableColumn<User, String> nameCol = new TableColumn<>("Name");
        TableColumn<User, Integer> ageCol = new TableColumn<>("Age");
        nameCol.setCellValueFactory(new PropertyValueFactory<>("name"));
        ageCol.setCellValueFactory(new PropertyValueFactory<>("age"));
        tableView.getColumns().addAll(nameCol, ageCol);
        // 计算当前页的数据
        int startItemIndex = pageIndex * 5; // 假设每页5项
        int endItemIndex = Math.min(startItemIndex + 5, users.size());
        // 显示当前页的数据
        tableView.setItems(FXCollections.observableArrayList(users.subList(startItemIndex, endItemIndex)));
        return new VBox(tableView);
    }
    public static class User {
        private String name;
        private int age;
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
    }
    public static void main(String[] args) {
        launch(args);
    }
}
Tree View(树视图)
用于以树状层次结构展示数据。它允许用户查看和操作具有父子关系的数据集合
案例演示
package com.binge.javafxdemo.component;
/**
 * @author binge
 * @Description
 * @date 2024年05月31日 上午 10:16
 */
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/**
 * TreeView 示例
 */
public class TreeViewExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 创建 TreeView
        TreeView<String> treeView = new TreeView<>();
        // 创建根节点
        TreeItem<String> root = new TreeItem<>("Fruits");
        // 创建子节点
        TreeItem<String> apple = new TreeItem<>("Apple");
        TreeItem<String> banana = new TreeItem<>("Banana");
        TreeItem<String> cherry = new TreeItem<>("Cherry");
        // 将子节点添加到根节点
        root.getChildren().add(apple);
        root.getChildren().add(banana);
        root.getChildren().add(cherry);
        // 设置 TreeView 的根节点
        treeView.setRoot(root);
        // 创建布局并添加 TreeView
        VBox vbox = new VBox(10); // 间距为 10
        vbox.getChildren().add(treeView);
        // 创建场景并设置舞台
        Scene scene = new Scene(vbox, 300, 200);
        primaryStage.setTitle("TreeView Demo");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}
Image View(图片视图)
ImageView 控件可以加载并显示图片文件,它允许你将图像资源嵌入到你的应用程序中。
案例演示
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class ImageViewExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            // 创建 ImageView 实例
            ImageView imageView = new ImageView();
            // 加载图片
            Image image = new Image("path/to/your/image.png");
            imageView.setImage(image);
            // 设置 ImageView 的属性
            imageView.setFitWidth(200); // 设置图片的显示宽度
            imageView.setPreserveRatio(true); // 保持图片的纵横比
            // 创建一个 Pane 作为布局容器
            Pane root = new Pane();
            root.getChildren().add(imageView);
            // 创建 Scene 并设置根布局
            Scene scene = new Scene(root, 300, 250);
            // 设置舞台(窗口)并显示
            primaryStage.setTitle("ImageView Example");
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        launch(args);
    }
}
MenuBar(菜单栏)
用于创建和管理菜单栏,它是用户界面中的一个水平条,其中包含多个菜单项(Menu)。用户可以通过点击菜单项来触发操作或显示子菜单
案例演示
package com.binge.javafxdemo.component;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.stage.Stage;
public class MenuBarExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 创建 MenuBar
        MenuBar menuBar = new MenuBar();
        // 创建菜单
        Menu fileMenu = new Menu("File");
        Menu editMenu = new Menu("Edit");
        // 创建菜单项
        MenuItem newFile = new MenuItem("New");
        MenuItem openFile = new MenuItem("Open");
        MenuItem close = new MenuItem("Close");
        // 将菜单项添加到文件菜单
        fileMenu.getItems().addAll(newFile, openFile, close);
        // 将菜单添加到 MenuBar
        menuBar.getMenus().addAll(fileMenu, editMenu);
        // 设置菜单项的事件处理器
        newFile.setOnAction(event -> {
            System.out.println("New file action");
        });
        // 创建场景并设置舞台
        Scene scene = new Scene(menuBar, 400, 200);
        primaryStage.setTitle("MenuBar Demo");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}
Dialog(弹出窗口)
用于创建模态对话框,它可以中断用户与应用程序主界面的交互,直到对话框被关闭
案例演示
package com.binge.javafxdemo.component;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBar;
import javafx.scene.control.Dialog;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.Window;
public class DialogExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 创建一个按钮,点击后会弹出对话框
        Button showDialogButton = new Button("Show Dialog");
        showDialogButton.setOnAction(event -> {
            showDialog(primaryStage);
        });
        // 创建一个垂直布局的 VBox
        VBox vbox = new VBox(10); // 间距为 10
        vbox.getChildren().add(showDialogButton);
        // 创建场景并设置舞台
        Scene scene = new Scene(vbox, 300, 200);
        primaryStage.setTitle("Dialog Demo");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    private void showDialog(Window owner) {
        // 创建一个带有确认和取消按钮的对话框
        Dialog<String> dialog = new Dialog<>();
        dialog.initOwner(owner);
        dialog.setTitle("Sample Dialog");
        dialog.setHeaderText("Look, a Dialog!");
        // 设置对话框的内容
        VBox dialogVbox = new VBox(10); // 间距为 10
        dialogVbox.getChildren().add(new Button("Click Me!"));
        // 创建按钮类型
        ButtonType seeButton = new ButtonType("OK", ButtonBar.ButtonData.OK_DONE);
        dialog.getDialogPane().getButtonTypes().addAll(seeButton, ButtonType.CANCEL);
        // 设置对话框按钮的事件处理器
        dialog.setResultConverter(dialogButton -> {
            if (dialogButton == seeButton) {
                return "User clicked See";
            }
            return null;
        });
        // 设置对话框的布局
        dialog.getDialogPane().setContent(dialogVbox);
        // 显示对话框
        dialog.showAndWait().ifPresent(result -> {
            System.out.println("Dialog result: " + result);
        });
    }
    public static void main(String[] args) {
        launch(args);
    }
}
AccordionMenu(手风琴菜单)
Accordion 是一个容器控件,用于管理一组可以展开和折叠的 TitledPane 对象。每个 TitledPane 可以包含其他控件,并具有一个标题,用户可以点击这个标题来展开或折叠 TitledPane 的内容。Accordion 允许多个 TitledPane 在同一空间内以整洁的方式排列,用户一次只能看到一个 TitledPane 的内容。
案例演示
package com.binge.javafxdemo.component;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Accordion;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.scene.control.*;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
/**
 * AccordionMenuExample 类用于演示带手风琴效果的左侧导航菜单
 */
public class AccordionMenuExample extends Application {
    private AnchorPane mainContent;
    @Override
    public void start(Stage primaryStage) {
        // 创建 Accordion 用于左侧导航
        Accordion accordion = new Accordion();
        // 创建首页导航项
        TitledPane homePane = new TitledPane("首页", createLinksPane());
        accordion.getPanes().add(homePane);
        // 创建主要内容区域
        mainContent = new AnchorPane();
        mainContent.setStyle("-fx-background-color: white;");
        // 创建 SplitPane 来容纳侧边栏和主要内容区域
        SplitPane splitPane = new SplitPane(accordion, mainContent);
        splitPane.setDividerPositions(0.2); // 设置分隔条位置,侧边栏占20%
        // 创建场景
        Scene scene = new Scene(splitPane, 800, 600);
        // 设置舞台
        primaryStage.setTitle("带手风琴效果的左侧导航");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    // 创建链接区域
    private VBox createLinksPane() {
        VBox linksPane = new VBox(10);
        linksPane.setStyle("-fx-background-color: #f0f0f0;");
        // 创建链接按钮并设置事件处理器
        Button personalCenterBtn = new Button("个人中心");
        personalCenterBtn.setOnAction(e -> updateMainContent("个人中心内容"));
        linksPane.getChildren().add(personalCenterBtn);
        Button memberCenterBtn = new Button("会员中心");
        memberCenterBtn.setOnAction(e -> updateMainContent("会员中心内容"));
        linksPane.getChildren().add(memberCenterBtn);
        Button customerCenterBtn = new Button("客户中心");
        customerCenterBtn.setOnAction(e -> updateMainContent("客户中心内容"));
        linksPane.getChildren().add(customerCenterBtn);
        return linksPane;
    }
    // 更新主要内容区域的方法
    private void updateMainContent(String content) {
        // 清除当前主要内容区域的所有子节点
        mainContent.getChildren().clear();
        // 创建一个新的 Label 并添加到主要内容区域
        Label contentLabel = new Label(content);
        contentLabel.setStyle("-fx-wrap-text: true; -fx-text-alignment: center;");
        AnchorPane.setTopAnchor(contentLabel, 50.0);
        AnchorPane.setLeftAnchor(contentLabel, 50.0);
        mainContent.getChildren().add(contentLabel);
    }
    public static void main(String[] args) {
        launch(args);
    }
}
Date Picker(日期选择器)
允许用户通过一个下拉日历视图选择日期
案例演示
package com.binge.javafxdemo.component;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.DatePicker;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.time.LocalDate;
/**
 * DatePicker 示例
 */
public class DatePickerExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 创建 DatePicker 控件
        DatePicker datePicker = new DatePicker();
        // 设置默认日期为当前日期
        datePicker.setValue(LocalDate.now());
        // 监听日期变化
        datePicker.valueProperty().addListener((obs, oldDate, newDate) -> {
            System.out.println("Selected date changed to: " + newDate);
        });
        // 创建布局并添加 DatePicker
        VBox vbox = new VBox(10); // 间距为 10
        vbox.getChildren().add(datePicker);
        // 创建场景并设置舞台
        Scene scene = new Scene(vbox, 300, 200);
        primaryStage.setTitle("DatePicker Demo");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}
File Chooser(文件选择器)
用于打开一个对话框,让用户能够浏览、选择文件或目录,以及保存文件
案例演示
package com.binge.javafxdemo.component;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import java.io.File;
/**
 * FileChooser 示例
 */
public class FileChooserExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 创建一个按钮,点击时打开文件选择器
        Button openButton = new Button("Open File");
        openButton.setOnAction(event -> {
            FileChooser fileChooser = new FileChooser();
            fileChooser.setTitle("Open a File");
            // 设置初始目录(可选)
            // fileChooser.setInitialDirectory(new File("/path/to/directory"));
            // 设置文件过滤器(可选)
            FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("All Files (*.*)", "*.*");
            fileChooser.getExtensionFilters().add(extFilter);
            File file = fileChooser.showOpenDialog(primaryStage);
            if (file != null) {
                System.out.println("Selected file: " + file.getAbsolutePath());
            }
        });
        // 创建布局并添加按钮
        VBox vbox = new VBox(10); // 间距为 10
        vbox.getChildren().add(openButton);
        // 创建场景并设置舞台
        Scene scene = new Scene(vbox, 300, 200);
        primaryStage.setTitle("FileChooser Demo");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}
												
											JavaFX 常见UI控件使用的更多相关文章
- JavaFX 的 UI 控件集 ControlsFX
		
出处:http://www.oschina.net/p/controlsfx JavaFX 的 UI 控件集 ControlsFX ControlsFX 开源项目旨在为 JavaFX 开发提供更多的 ...
 - UI控件概述
		
常见UI控件 UIKit框架提供了非常多功能强大又易用的UI控件,以便于开发者打造出各式各样的App 以下列举一些在开发中常见的UI控件(稍后补上图片示例) 1.UILabel– 文本标签:作用是显示 ...
 - WinForm/Silverlight多线程编程中如何更新UI控件的值
		
单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么 ...
 - UI控件(复习一下)
		
如何修改控件状态• 可见,确实需要经常修改控件状态• 那如何去修改控件的状态呢?方法很简单➢ 每一个UI控件都是一个对象➢ 修改UI控件的状态,其实就是修改控件对象的属性➢ 比如修改UILabel显示 ...
 - ios 中的UI控件学习总结(1)
		
UIKit框架提供了非常多功能强大又易用的UI控件 下面列举一些在开发中可能用得上的UI控件 UIButton 按钮 UILabel 文本标签 UITextField 文本输入框 UIImageVie ...
 - 优化UI控件 【译】
		
翻译自:https://unity3d.com/cn/learn/tutorials/topics/best-practices/optimizing-ui-controls?playlist=300 ...
 - 面试题汇总--数据储存/应用程序/UI控件/客户端的安全性与框架处理。。。
		
一 数据储存 1.如果后期需要增加数据库中的字段怎么实现,如果不使用 CoreData 呢?编写 SQL 语句来操作原来表中的字段1)增加表字段ALTER TABLE 表名 ADD COLUMN 字 ...
 - vue-autoui自匹配webapi的UI控件
		
vue-autoui 是一款基于vue和element扩展的一个自动化UI控件,它主要提供两个控件封装分别是auto-form和auto-grid; 通过这两个控件可以完成大多数的信息输入和查询输出的 ...
 - ANDROID L——Material Design详解(UI控件)
		
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...
 - 富客户端 wpf, Winform 多线程更新UI控件
		
前言 在富客户端的app中,如果在主线程中运行一些长时间的任务,那么应用程序的UI就不能正常相应.因为主线程要负责消息循环,相应鼠标等事件还有展现UI. 因此我们可以开启一个线程来格外处理需要长时间的 ...
 
随机推荐
- 6月23日直播预告丨如何自定义Flink LookupTable
			
 数栈是云原生-站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实 ...
 - C#/.NET/.NET Core技术前沿周刊 | 第 43 期(2025年6.16-6.22)
			
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
 - pycharm无法正常调试问题
			
pycharm无法正常调试问题 1.错误代码 已连接到 pydev 调试器(内部版本号 231.8109.197)Traceback (most recent call last): File &qu ...
 - ET框架对MongoDB的使用
			
一:本地测试: 1:加载DB组件 2:调整用户ID : C2G_LoginGateHandler中创建玩家时id调整.(每次重启服务端创建小人ID是一样的,插入数据库会覆盖掉上传插入的数据) 3:在 ...
 - [CSP-S 2022] 数据传输
			
link 题外话:考场写了个 \(3^3\) 巨大多恶心的分讨倍增写吐了,不仅没调出来还导致没时间仔细考虑 T1 T3 的 bug,感谢这题送我退役. 对于 \(K=1\),相当于树上路径点权和. 对 ...
 - SQL Server AVG函数取整问题
			
SQL Sever的均值函数在求整数类型的数据均值是结果还是整数,并且不会四舍五入.也就是向下取整.这里先创建一个成绩表,并适当添加数据. CREATE TABLE sic( 学号 nchar(10) ...
 - react开发组件并发包到npm
			
Toast组件 import ReactDomCli from 'react-dom/client'; import './style.css' import React from 'react'; ...
 - js对象生成ts类型声明
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - HK  笔试面试
			
考到了很多的 网络技术工程师的题目 几门没写出来 还考了一道题 pread 我不清楚 什么 意思 考了 链表的删除 会一点点 考了buff的读取 会一点点 不是基于 宏定义的 内核
 - 企业AI知识库的文件解析痛点-Word格式解析优化(准确率95%)-100%开源
			
一.前言 在大模型和RAG(检索增强生成)技术飞速发展的今天,企业AI知识库建设已成为AI落地的核心战场.而文件解析是所有参与做企业AI知识库开发者所避免不了的难题. 本文将结合我在开发TorchV ...