JavaFX案例

wen java案例 1

本文目录导读:

JavaFX案例

  1. 基础案例:计算器
  2. 进阶案例:待办事项管理器
  3. 综合案例:学生成绩管理系统
  4. 图表案例:数据可视化
  5. 使用建议

我将为您提供几个JavaFX的实用案例,从基础到进阶,帮助您快速上手。

基础案例:计算器

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class CalculatorDemo extends Application {
    private TextField displayField;
    private double firstNumber = 0;
    private String operator = "";
    private boolean startNewNumber = true;
    @Override
    public void start(Stage primaryStage) {
        // 创建显示区域
        displayField = new TextField();
        displayField.setEditable(false);
        displayField.setAlignment(Pos.CENTER_RIGHT);
        displayField.setPrefHeight(50);
        displayField.setStyle("-fx-font-size: 20px;");
        // 创建按钮布局
        GridPane grid = new GridPane();
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(20));
        // 按钮数组
        String[][] buttonLabels = {
            {"7", "8", "9", "/"},
            {"4", "5", "6", "*"},
            {"1", "2", "3", "-"},
            {"0", ".", "=", "+"},
            {"C", "CE", "", ""}
        };
        // 创建按钮并添加到网格
        for (int row = 0; row < buttonLabels.length; row++) {
            for (int col = 0; col < buttonLabels[row].length; col++) {
                String label = buttonLabels[row][col];
                if (label.isEmpty()) continue;
                Button button = new Button(label);
                button.setPrefSize(60, 50);
                button.setStyle("-fx-font-size: 16px;");
                // 设置按钮样式
                if (label.matches("[0-9.]")) {
                    button.setStyle("-fx-font-size: 16px; -fx-background-color: #f0f0f0;");
                } else if (label.equals("=")) {
                    button.setStyle("-fx-font-size: 16px; -fx-background-color: #4CAF50; -fx-text-fill: white;");
                } else {
                    button.setStyle("-fx-font-size: 16px; -fx-background-color: #ff9800; -fx-text-fill: white;");
                }
                // 绑定事件
                button.setOnAction(e -> handleButtonClick(label));
                grid.add(button, col, row);
            }
        }
        // 整体布局
        GridPane root = new GridPane();
        root.setPadding(new Insets(20));
        root.setVgap(10);
        root.add(displayField, 0, 0);
        root.add(grid, 0, 1);
        Scene scene = new Scene(root, 300, 350);
        primaryStage.setTitle("JavaFX 计算器");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    private void handleButtonClick(String value) {
        switch (value) {
            case "C":
                clearAll();
                break;
            case "CE":
                clearEntry();
                break;
            case "=":
                calculate();
                break;
            case "+":
            case "-":
            case "*":
            case "/":
                setOperator(value);
                break;
            default:
                inputNumber(value);
        }
    }
    private void inputNumber(String digit) {
        if (startNewNumber) {
            displayField.setText(digit);
            startNewNumber = false;
        } else {
            if (digit.equals(".") && displayField.getText().contains(".")) {
                return;
            }
            displayField.setText(displayField.getText() + digit);
        }
    }
    private void setOperator(String op) {
        if (!displayField.getText().isEmpty()) {
            firstNumber = Double.parseDouble(displayField.getText());
            operator = op;
            startNewNumber = true;
        }
    }
    private void calculate() {
        if (!operator.isEmpty() && !displayField.getText().isEmpty()) {
            double secondNumber = Double.parseDouble(displayField.getText());
            double result = 0;
            switch (operator) {
                case "+": result = firstNumber + secondNumber; break;
                case "-": result = firstNumber - secondNumber; break;
                case "*": result = firstNumber * secondNumber; break;
                case "/":
                    if (secondNumber != 0) {
                        result = firstNumber / secondNumber;
                    } else {
                        displayField.setText("错误:除数不能为0");
                        startNewNumber = true;
                        operator = "";
                        return;
                    }
                    break;
            }
            displayField.setText(String.valueOf(result));
            operator = "";
            startNewNumber = true;
        }
    }
    private void clearAll() {
        displayField.clear();
        firstNumber = 0;
        operator = "";
        startNewNumber = true;
    }
    private void clearEntry() {
        displayField.clear();
        startNewNumber = true;
    }
    public static void main(String[] args) {
        launch(args);
    }
}

进阶案例:待办事项管理器

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class TodoListDemo extends Application {
    private ListView<TodoItem> listView;
    private TextField taskField;
    private DatePicker datePicker;
    @Override
    public void start(Stage primaryStage) {
        // 创建标题
        Label title = new Label("待办事项管理器");
        title.setStyle("-fx-font-size: 24px; -fx-font-weight: bold;");
        // 创建输入区域
        taskField = new TextField();
        taskField.setPromptText("输入待办事项...");
        taskField.setPrefWidth(250);
        datePicker = new DatePicker();
        datePicker.setValue(LocalDate.now());
        Button addButton = new Button("添加");
        addButton.setStyle("-fx-background-color: #2196F3; -fx-text-fill: white;");
        Button deleteButton = new Button("删除");
        deleteButton.setStyle("-fx-background-color: #f44336; -fx-text-fill: white;");
        HBox inputBox = new HBox(10);
        inputBox.setAlignment(Pos.CENTER);
        inputBox.getChildren().addAll(taskField, datePicker, addButton, deleteButton);
        // 创建列表
        listView = new ListView<>();
        listView.setPrefSize(500, 300);
        listView.setPlaceholder(new Label("暂无待办事项"));
        // 事件处理
        addButton.setOnAction(e -> addTodoItem());
        deleteButton.setOnAction(e -> deleteTodoItem());
        taskField.setOnAction(e -> addTodoItem());
        // 布局
        VBox topBox = new VBox(10);
        topBox.setAlignment(Pos.CENTER);
        topBox.getChildren().addAll(title, inputBox);
        BorderPane root = new BorderPane();
        root.setTop(topBox);
        root.setCenter(listView);
        root.setPadding(new Insets(20));
        Scene scene = new Scene(root, 550, 400);
        primaryStage.setTitle("待办事项管理器");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    private void addTodoItem() {
        String task = taskField.getText().trim();
        if (!task.isEmpty()) {
            TodoItem item = new TodoItem(task, datePicker.getValue());
            listView.getItems().add(item);
            taskField.clear();
        }
    }
    private void deleteTodoItem() {
        TodoItem selected = listView.getSelectionModel().getSelectedItem();
        if (selected != null) {
            listView.getItems().remove(selected);
        }
    }
    // 内部类:待办事项
    private class TodoItem {
        private String task;
        private LocalDate date;
        private boolean completed;
        public TodoItem(String task, LocalDate date) {
            this.task = task;
            this.date = date;
            this.completed = false;
        }
        @Override
        public String toString() {
            String status = completed ? "✓" : "○";
            String dateStr = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            return String.format("%s %s (截止: %s)", status, task, dateStr);
        }
    }
    public static void main(String[] args) {
        launch(args);
    }
}

综合案例:学生成绩管理系统

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class StudentGradeDemo extends Application {
    private TableView<Student> tableView;
    private TextField nameField, idField, scoreField;
    private ComboBox<String> gradeComboBox;
    private ObservableList<Student> studentList;
    @Override
    public void start(Stage primaryStage) {
        // 创建示例数据
        studentList = FXCollections.observableArrayList();
        studentList.addAll(
            new Student("张一", "2024001", 85.5, "优秀"),
            new Student("李二", "2024002", 72.0, "良好"),
            new Student("王三", "2024003", 58.5, "及格"),
            new Student("赵四", "2024004", 45.0, "不及格")
        );
        // 创建表格
        tableView = new TableView<>();
        tableView.setItems(studentList);
        // 创建列
        TableColumn<Student, String> nameCol = new TableColumn<>("姓名");
        nameCol.setCellValueFactory(new PropertyValueFactory<>("name"));
        nameCol.setPrefWidth(100);
        TableColumn<Student, String> idCol = new TableColumn<>("学号");
        idCol.setCellValueFactory(new PropertyValueFactory<>("studentId"));
        idCol.setPrefWidth(100);
        TableColumn<Student, Double> scoreCol = new TableColumn<>("成绩");
        scoreCol.setCellValueFactory(new PropertyValueFactory<>("score"));
        scoreCol.setPrefWidth(100);
        TableColumn<Student, String> gradeCol = new TableColumn<>("等级");
        gradeCol.setCellValueFactory(new PropertyValueFactory<>("grade"));
        gradeCol.setPrefWidth(100);
        tableView.getColumns().addAll(nameCol, idCol, scoreCol, gradeCol);
        // 创建输入表单
        GridPane formGrid = new GridPane();
        formGrid.setHgap(10);
        formGrid.setVgap(10);
        formGrid.setPadding(new Insets(10));
        nameField = new TextField();
        nameField.setPromptText("姓名");
        idField = new TextField();
        idField.setPromptText("学号");
        scoreField = new TextField();
        scoreField.setPromptText("成绩");
        gradeComboBox = new ComboBox<>();
        gradeComboBox.getItems().addAll("优秀", "良好", "中等", "及格", "不及格");
        gradeComboBox.setPromptText("选择等级");
        formGrid.add(new Label("姓名:"), 0, 0);
        formGrid.add(nameField, 1, 0);
        formGrid.add(new Label("学号:"), 0, 1);
        formGrid.add(idField, 1, 1);
        formGrid.add(new Label("成绩:"), 0, 2);
        formGrid.add(scoreField, 1, 2);
        formGrid.add(new Label("等级:"), 0, 3);
        formGrid.add(gradeComboBox, 1, 3);
        // 按钮
        Button addBtn = new Button("添加学生");
        addBtn.setStyle("-fx-background-color: #4CAF50; -fx-text-fill: white;");
        Button updateBtn = new Button("更新学生");
        updateBtn.setStyle("-fx-background-color: #2196F3; -fx-text-fill: white;");
        Button deleteBtn = new Button("删除学生");
        deleteBtn.setStyle("-fx-background-color: #f44336; -fx-text-fill: white;");
        Button clearBtn = new Button("清空表单");
        HBox buttonBox = new HBox(10);
        buttonBox.getChildren().addAll(addBtn, updateBtn, deleteBtn, clearBtn);
        // 统计信息
        Label statsLabel = new Label();
        statsLabel.setStyle("-fx-font-size: 14px;");
        Button statsBtn = new Button("计算统计");
        statsBtn.setOnAction(e -> {
            double avg = studentList.stream()
                .mapToDouble(Student::getScore)
                .average()
                .orElse(0);
            double max = studentList.stream()
                .mapToDouble(Student::getScore)
                .max()
                .orElse(0);
            double min = studentList.stream()
                .mapToDouble(Student::getScore)
                .min()
                .orElse(0);
            statsLabel.setText(String.format("平均分: %.2f, 最高分: %.2f, 最低分: %.2f", avg, max, min));
        });
        // 事件处理
        addBtn.setOnAction(e -> addStudent());
        updateBtn.setOnAction(e -> updateStudent());
        deleteBtn.setOnAction(e -> deleteStudent());
        clearBtn.setOnAction(e -> clearForm());
        // 选中表格行时填充表单
        tableView.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
            if (newSelection != null) {
                fillForm(newSelection);
            }
        });
        // 布局
        VBox leftBox = new VBox(10);
        leftBox.setPadding(new Insets(10));
        leftBox.getChildren().addAll(
            new Label("学生信息管理"),
            tableView,
            statsBtn,
            statsLabel
        );
        VBox rightBox = new VBox(10);
        rightBox.setPadding(new Insets(10));
        rightBox.setPrefWidth(300);
        rightBox.getChildren().addAll(
            new Label("学生信息录入"),
            formGrid,
            buttonBox
        );
        BorderPane root = new BorderPane();
        root.setCenter(leftBox);
        root.setRight(rightBox);
        Scene scene = new Scene(root, 800, 500);
        primaryStage.setTitle("学生成绩管理系统");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    private void addStudent() {
        if (validateForm()) {
            Student student = new Student(
                nameField.getText(),
                idField.getText(),
                Double.parseDouble(scoreField.getText()),
                gradeComboBox.getValue()
            );
            studentList.add(student);
            clearForm();
            showAlert("添加成功", "学生信息已添加");
        }
    }
    private void updateStudent() {
        Student selected = tableView.getSelectionModel().getSelectedItem();
        if (selected != null && validateForm()) {
            selected.setName(nameField.getText());
            selected.setStudentId(idField.getText());
            selected.setScore(Double.parseDouble(scoreField.getText()));
            selected.setGrade(gradeComboBox.getValue());
            tableView.refresh();
            clearForm();
            showAlert("更新成功", "学生信息已更新");
        } else {
            showAlert("错误", "请先选择要更新的学生");
        }
    }
    private void deleteStudent() {
        Student selected = tableView.getSelectionModel().getSelectedItem();
        if (selected != null) {
            studentList.remove(selected);
            clearForm();
            showAlert("删除成功", "学生信息已删除");
        } else {
            showAlert("错误", "请先选择要删除的学生");
        }
    }
    private void fillForm(Student student) {
        nameField.setText(student.getName());
        idField.setText(student.getStudentId());
        scoreField.setText(String.valueOf(student.getScore()));
        gradeComboBox.setValue(student.getGrade());
    }
    private void clearForm() {
        nameField.clear();
        idField.clear();
        scoreField.clear();
        gradeComboBox.setValue(null);
    }
    private boolean validateForm() {
        if (nameField.getText().isEmpty() || 
            idField.getText().isEmpty() || 
            scoreField.getText().isEmpty() || 
            gradeComboBox.getValue() == null) {
            showAlert("错误", "请填写所有必填字段");
            return false;
        }
        try {
            double score = Double.parseDouble(scoreField.getText());
            if (score < 0 || score > 100) {
                showAlert("错误", "成绩必须在0-100之间");
                return false;
            }
        } catch (NumberFormatException e) {
            showAlert("错误", "成绩必须是数字");
            return false;
        }
        return true;
    }
    private void showAlert(String title, String message) {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(message);
        alert.showAndWait();
    }
    public static void main(String[] args) {
        launch(args);
    }
    // 学生类
    public static class Student {
        private String name;
        private String studentId;
        private double score;
        private String grade;
        public Student(String name, String studentId, double score, String grade) {
            this.name = name;
            this.studentId = studentId;
            this.score = score;
            this.grade = grade;
        }
        // Getter和Setter
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public String getStudentId() { return studentId; }
        public void setStudentId(String studentId) { this.studentId = studentId; }
        public double getScore() { return score; }
        public void setScore(double score) { this.score = score; }
        public String getGrade() { return grade; }
        public void setGrade(String grade) { this.grade = grade; }
    }
}

图表案例:数据可视化

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.chart.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ChartDemo extends Application {
    @Override
    public void start(Stage primaryStage) {
        VBox root = new VBox(20);
        root.setPadding(new javafx.geometry.Insets(20));
        // 1. 柱状图
        CategoryAxis xAxis = new CategoryAxis();
        NumberAxis yAxis = new NumberAxis(0, 100, 10);
        BarChart<String, Number> barChart = new BarChart<>(xAxis, yAxis);
        barChart.setTitle("各科成绩");
        XYChart.Series<String, Number> series = new XYChart.Series<>();
        series.setName("成绩");
        series.getData().addAll(
            new XYChart.Data<>("语文", 85),
            new XYChart.Data<>("数学", 92),
            new XYChart.Data<>("英语", 78),
            new XYChart.Data<>("物理", 88),
            new XYChart.Data<>("化学", 95)
        );
        barChart.getData().add(series);
        // 2. 饼图
        ObservableList<PieChart.Data> pieData = FXCollections.observableArrayList(
            new PieChart.Data("学习", 30),
            new PieChart.Data("工作", 40),
            new PieChart.Data("休闲", 20),
            new PieChart.Data("其他", 10)
        );
        PieChart pieChart = new PieChart(pieData);
        pieChart.setTitle("时间分配");
        // 3. 折线图
        NumberAxis xAxis2 = new NumberAxis(1, 12, 1);
        NumberAxis yAxis2 = new NumberAxis(0, 100, 10);
        LineChart<Number, Number> lineChart = new LineChart<>(xAxis2, yAxis2);
        lineChart.setTitle("全年销量");
        XYChart.Series<Number, Number> lineSeries = new XYChart.Series<>();
        lineSeries.setName("月度销量");
        lineSeries.getData().addAll(
            new XYChart.Data<>(1, 45),
            new XYChart.Data<>(2, 60),
            new XYChart.Data<>(3, 55),
            new XYChart.Data<>(4, 75),
            new XYChart.Data<>(5, 82),
            new XYChart.Data<>(6, 70),
            new XYChart.Data<>(7, 90),
            new XYChart.Data<>(8, 85),
            new XYChart.Data<>(9, 76),
            new XYChart.Data<>(10, 88),
            new XYChart.Data<>(11, 92),
            new XYChart.Data<>(12, 95)
        );
        lineChart.getData().add(lineSeries);
        root.getChildren().addAll(barChart, pieChart, lineChart);
        ScrollPane scrollPane = new ScrollPane(root);
        scrollPane.setFitToWidth(true);
        Scene scene = new Scene(scrollPane, 800, 1200);
        primaryStage.setTitle("数据可视化");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

使用建议

  1. 运行时需要添加JavaFX依赖,如果使用Maven,添加:

    <dependency>
     <groupId>org.openjfx</groupId>
     <artifactId>javafx-controls</artifactId>
     <version>17.0.6</version>
    </dependency>
    <dependency>
     <groupId>org.openjfx</groupId>
     <artifactId>javafx-fxml</artifactId>
     <version>17.0.6</version>
    </dependency>
  2. 运行前配置VM参数(IDEA):

    --module-path /path/to/javafx-sdk/lib --add-modules javafx.controls,javafx.fxml
  3. 学习建议

  • 从基础控件开始练习
  • 理解事件处理机制
  • 熟悉FXML布局文件
  • 多实践实际项目案例

这些案例涵盖了JavaFX的核心功能,您可以根据需求修改和扩展,希望这些示例对您有帮助!

抱歉,评论功能暂时关闭!