You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX新手求助:基于字符串实现TextField搜索预测功能

JavaFX实现类似谷歌的搜索预测TextField(无数据库版)

嘿,作为编程新手完全不用纠结数据库的事!咱们用最基础的JavaFX组件就能搞定这个搜索预测功能,我给你整理了一套完整的可运行代码,每一步都讲得明明白白,跟着做就行~

核心思路

咱们不用数据库,直接用一个List<String>来存储已保存的搜索字符串,然后通过监听TextField的输入变化,实时过滤出匹配的内容,用ListView展示这些预测结果,最后加上一些交互优化让体验更顺畅。

完整代码实现

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.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.util.Arrays;
import java.util.List;

public class SearchPredictTextField extends Application {
    // 模拟已保存的搜索字符串列表,你可以随便改里面的内容
    private final List<String> savedSearchTerms = Arrays.asList(
            "JavaFX入门教程",
            "Java集合框架详解",
            "Java多线程编程",
            "JavaFX布局技巧",
            "Java异常处理",
            "JavaFX控件使用"
    );

    private final ObservableList<String> filteredResults = FXCollections.observableArrayList();
    private ListView<String> predictionListView;

    @Override
    public void start(Stage primaryStage) {
        TextField searchTextField = new TextField();
        searchTextField.setPromptText("输入搜索内容...");

        // 初始化预测结果列表,默认藏起来
        predictionListView = new ListView<>(filteredResults);
        predictionListView.setVisible(false);
        predictionListView.setMaxHeight(150); // 限制高度,避免占满屏幕

        // 监听输入框的文本变化,实时过滤结果
        searchTextField.textProperty().addListener((observable, oldValue, newValue) -> {
            filteredResults.clear();
            if (newValue.isEmpty()) {
                predictionListView.setVisible(false);
                return;
            }
            // 过滤出包含输入内容的字符串(不区分大小写,更友好)
            savedSearchTerms.stream()
                    .filter(term -> term.toLowerCase().contains(newValue.toLowerCase()))
                    .forEach(filteredResults::add);

            // 有匹配结果就显示列表,否则隐藏
            predictionListView.setVisible(!filteredResults.isEmpty());
        });

        // 点击预测项,自动填充到输入框
        predictionListView.setOnMouseClicked(event -> {
            String selectedTerm = predictionListView.getSelectionModel().getSelectedItem();
            if (selectedTerm != null) {
                searchTextField.setText(selectedTerm);
                predictionListView.setVisible(false);
            }
        });

        // 输入框失去焦点时隐藏列表,重新获得焦点且有文本时再显示
        searchTextField.focusedProperty().addListener((observable, oldValue, newValue) -> {
            if (!newValue) {
                predictionListView.setVisible(false);
            } else if (!searchTextField.getText().isEmpty()) {
                // 触发文本监听更新结果
                searchTextField.textProperty().getValue();
            }
        });

        // 布局:输入框在上,预测列表在下
        VBox root = new VBox(5);
        root.getChildren().addAll(searchTextField, predictionListView);
        root.setStyle("-fx-padding: 10px;");

        Scene scene = new Scene(root, 400, 300);
        primaryStage.setTitle("搜索预测示例");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

关键部分解释

  • 模拟数据源:savedSearchTerms这个List就是你的"已保存字符串",直接修改里面的内容就能替换成自己的搜索词。
  • 文本监听逻辑:通过textProperty().addListener实时捕捉输入变化,用Stream API快速过滤匹配内容,不区分大小写的匹配能让用户输入更轻松。
  • 交互细节优化:
    • 点击预测结果自动填充输入框并隐藏列表
    • 输入为空或无匹配结果时自动隐藏列表
    • 输入框失去焦点时隐藏列表,重新聚焦且有文本时再显示结果

你直接运行这段代码就能看到效果啦!如果想调整样式或者扩展功能(比如添加更多搜索词),直接修改对应的部分就好~

内容的提问来源于stack exchange,提问作者Muhammad Musharaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:02:36