java - 在 javafx 中创建自动完成搜索表单

标签 java javafx

想知道自己想要什么

enter image description here

单击文本字段时,会出现下拉菜单,其中包含用户在文本字段中键入内容时过滤掉的建议。盒子的高度也应实时调整以包含所有项目,或最多包含 10 个项目。

我设法使用 ComboBox 使它有点工作,但它的边缘感觉有点粗糙,而且似乎不可能做我想做的事(下拉菜单不会调整大小,除非你关闭它并重新打开它它)。

新想法,有一个文本字段,然后显示一个 VBox 按钮作为下拉列表。唯一的问题是我不知道如何定位下拉菜单,使其不会停留在正常流程中,以便它可以覆盖文本字段下方的任何现有元素。有什么想法吗?

最佳答案

请考虑这个例子,你可以把这个想法应用到你的项目中。

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class SearchFormJavaFX  extends Application{

    @Override
    public void start(Stage ps) throws Exception {
        String[] options = {"How do I get a passport",
                            "How do I delete my Facebook Account",
                            "How can I change my password",
                            "How do I write some code in my question :D"}; 

        // note that you don't need to stick to these types of containers, it's just an example
        StackPane root = new StackPane();
        GridPane container = new GridPane();
        HBox searchBox = new HBox();

        ////////////////////////////////////////////////////

        TextField text = new TextField(); 

        // add a listener to listen to the changes in the text field
        text.textProperty().addListener((observable, oldValue, newValue) -> {
            if(container.getChildren().size()>1){ // if already contains a drop-down menu -> remove it 
                container.getChildren().remove(1);
            }
            container.add(populateDropDownMenu(newValue, options),0,1); // then add the populated drop-down menu to the second row in the grid pane
        });

        // those buttons just for example
        // note that you can add action listeners to them ..etc
        Button close = new Button("X");
        Button search = new Button("Search");
        searchBox.getChildren().addAll(text,close,search);


        /////////////////////////////////////////////////

        // add the search box to first row
        container.add(searchBox, 0, 0);
        // the colors in all containers only for example
        container.setBackground(new Background(new BackgroundFill(Color.GRAY, null,null)));
        ////////////////////////////////////////////////

        root.getChildren().add(container);

        Scene scene = new Scene(root, 225,300);
        ps.setScene(scene);
        ps.show();


    }


    // this method searches for a given text in an array of Strings (i.e. the options)
    // then returns a VBox containing all matches
    public static VBox populateDropDownMenu(String text, String[] options){
        VBox dropDownMenu = new VBox();
        dropDownMenu.setBackground(new Background(new BackgroundFill(Color.GREEN, null,null))); // colors just for example
        dropDownMenu.setAlignment(Pos.CENTER); // all these are optional and up to you

        for(String option : options){ // loop through every String in the array
            // if the given text is not empty and doesn't consists of spaces only, as well as it's a part of one (or more) of the options
            if(!text.replace(" ", "").isEmpty() && option.toUpperCase().contains(text.toUpperCase())){ 
                Label label = new Label(option); // create a label and set the text 
                // you can add listener to the label here if you want
                // your user to be able to click on the options in the drop-down menu
                dropDownMenu.getChildren().add(label); // add the label to the VBox
            }
        }

        return dropDownMenu; // at the end return the VBox (i.e. drop-down menu)
    }



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

}

enter image description here enter image description here

关于java - 在 javafx 中创建自动完成搜索表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44028055/

相关文章:

java - 有没有办法通过整数调用JLabel

java - 数学值计算不正确

java - 如何从媒体对象获取元数据

listview - JavaFX ListView 带有用于上下滚动的触摸事件

java - 在 JavaFX 阶段使用 java.awt.Robot 安全吗?

java - QuickFIX/J 中断开连接的客户端的消息队列行为

java - 将2位数字变成3位数字并将其反转

java - 我们可以在早期版本的 tableau 中使用 java 读取 tableau 摘录吗?

java - 在 JavaFX8 中播放视频

javafx Tableview 按日期排序