Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将筛选的组合框项链接到输入_Java_Javafx_Combobox_Javafx 8 - Fatal编程技术网

Java 将筛选的组合框项链接到输入

Java 将筛选的组合框项链接到输入,java,javafx,combobox,javafx-8,Java,Javafx,Combobox,Javafx 8,在我的可编辑组合框中,我可以根据输入过滤我的建议,我可以启动按钮事件。问题是,如果我在可编辑字段中键入我的项目名称之一(如action3),然后单击第一个建议(也是action3),这是一个合适的项目,它总是会触发与第一个索引action1相关的按钮,因为它有第一个索引,但是第一个索引是action1 List<EventHandler<ActionEvent>> handlers = Arrays.asList( this::action1,

在我的可编辑组合框中,我可以根据输入过滤我的建议,我可以启动
按钮
事件。问题是,如果我在可编辑字段中键入我的项目名称之一(如
action3
),然后单击第一个建议(也是
action3
),这是一个合适的项目,它总是会触发与第一个索引
action1
相关的按钮,因为它有第一个索引,但是第一个索引是
action1

List<EventHandler<ActionEvent>> handlers = Arrays.asList(
            this::action1,
            this::action2,
            this::action3
            );
编辑1:

我的新initialize()方法如下所示:

protected void initialize() {
    new AutoCompleteBox<>(autoBox);     
    ObservableList<ActionEventHandler> data = FXCollections.observableArrayList(
            new ActionEventHandler("action1", this::action1),
            new ActionEventHandler("action2", this::action2,
            new ActionEventHandler("action3", this::action3)
    );
    autoBox.getItems().setAll(data);
    FilteredList<ActionEventHandler> filtered = new FilteredList<>(data);
    ComboBox<ActionEventHandler> autoBox = new ComboBox<>(filtered);
    autoBox.setOnAction(event -> {
        ActionEventHandler h = autoBox.getValue();
        if (h != null) {
            h.handle(event);
        }
    });
    autoBox.setEditable(true);
    autoBox.setConverter(new StringConverter<ActionEventHandler>() {

        @Override
        public String toString(ActionEventHandler object) {
            return object == null ? "" : object.toString();
        }

        @Override
        public ActionEventHandler fromString(String string) {
            if (string == null) {
                return null;
            }
            for (ActionEventHandler h : data) {
                if (string.equals(h.toString())) {
                    return h;
                }
            }
            return null;
        }

    });

    autoBox.getEditor().textProperty().addListener((observable, oldValue, newValue) -> {
        filtered.setPredicate(h -> h.toString().startsWith(newValue));
    });

}

我无法将函数(如
action1
链接到字符串
action1
)或者我更相信的是,我无法将自定义类与我的自定义
组合框组合起来,尝试获取项目的字符串并检查字符串内容。如果是“action3”,则称该事件为action3。代码:
(String)cbKategorieMain.getSelectedItem()
将以字符串形式获取组合框的内容

尝试获取项目的字符串并检查字符串内容。如果是“action3”,则称该事件为action3。代码:
(String)cbKategorieMain.getSelectedItem()
将以字符串形式获取组合框的内容。在这种情况下,最好使用
事件处理程序
作为返回字符串的项。添加
转换器
以将项目转换为非
字符串
对象

public class ActionEventHandler implements EventHandler<ActionEvent> {

    private final EventHandler<ActionEvent> eventHandler;
    private final String name;

    public ActionEventHandler(String name, EventHandler<ActionEvent> eventHandler) {
        Objects.requireNonNull(name);
        Objects.requireNonNull(eventHandler);
        this.name = name;
        this.eventHandler = eventHandler;
    }

    @Override
    public String toString() {
        return name;
    }

    @Override
    public void handle(ActionEvent event) {
        eventHandler.handle(event);
    }

}

(我还没有检查您的
AutoCompleteBox
类的详细信息…

在这种情况下,最好使用
EventHandler
s作为返回字符串的项。添加
转换器
以将项目转换为非
字符串
对象

public class ActionEventHandler implements EventHandler<ActionEvent> {

    private final EventHandler<ActionEvent> eventHandler;
    private final String name;

    public ActionEventHandler(String name, EventHandler<ActionEvent> eventHandler) {
        Objects.requireNonNull(name);
        Objects.requireNonNull(eventHandler);
        this.name = name;
        this.eventHandler = eventHandler;
    }

    @Override
    public String toString() {
        return name;
    }

    @Override
    public void handle(ActionEvent event) {
        eventHandler.handle(event);
    }

}

(我还没有检查你的
AutoCompleteBox
类的详细信息…

我想更多的是将索引号更新为显示的建议。我想更多的是将索引号更新为显示的建议。我在一个新类
AutoCompleteBox(autoBox)中创建了一个自己的组合框已可编辑,我可以在我的控制器中添加较低的代码
initialize()
,然后调用
new AutoCompleteBox(autoBox)之后?我得到一个空的下拉列表。@快速从我的较低代码中删除组合框创建,将其添加到控制器的
initialize()
方法中,并使用
combobox.getItems().setAll(…)
而不是在
combobox
构造函数中指定项目列表。(IDK,如果您必须用自定义的
组合框
类型修改我的代码…),当然,用您使用的
组合框
的字段名替换
组合框
。我编辑了上面问题中的代码,现在我得到了元素(action1..)但是我不能使用这些动作。我没有看到你在某处将
组合框添加到场景中。。。此外,您可能不应该将您的过滤方法与我的方法相结合AutoCompleteBox(autoBox)已可编辑,我可以在我的控制器中添加较低的代码
initialize()
,然后调用
new AutoCompleteBox(autoBox)之后?我得到一个空的下拉列表。@快速从我的较低代码中删除组合框创建,将其添加到控制器的
initialize()
方法中,并使用
combobox.getItems().setAll(…)
而不是在
combobox
构造函数中指定项目列表。(IDK,如果您必须用自定义的
组合框
类型修改我的代码…),当然,用您使用的
组合框
的字段名替换
组合框
。我编辑了上面问题中的代码,现在我得到了元素(action1..)但是我不能使用这些动作。我没有看到你在某处将
组合框添加到场景中。。。此外,您可能不应该将您的过滤方法与我的方法相结合并将其放置在SceneBuilder中(在控制器的FXML内部)
public class ActionEventHandler implements EventHandler<ActionEvent> {

    private final EventHandler<ActionEvent> eventHandler;
    private final String name;

    public ActionEventHandler(String name, EventHandler<ActionEvent> eventHandler) {
        Objects.requireNonNull(name);
        Objects.requireNonNull(eventHandler);
        this.name = name;
        this.eventHandler = eventHandler;
    }

    @Override
    public String toString() {
        return name;
    }

    @Override
    public void handle(ActionEvent event) {
        eventHandler.handle(event);
    }

}
ObservableList<ActionEventHandler> data = FXCollections.observableArrayList(
        new ActionEventHandler("action1", this::action1),
        new ActionEventHandler("action2", this::action2),
        new ActionEventHandler("action3", this::action3)
);
FilteredList<ActionEventHandler> filtered = new FilteredList<>(data);
ComboBox<ActionEventHandler> comboBox = new ComboBox<>(filtered);
comboBox.setOnAction(event -> {
    ActionEventHandler h = comboBox.getValue();
    if (h != null) {
        h.handle(event);
    }
});
comboBox.setEditable(true);
comboBox.setConverter(new StringConverter<ActionEventHandler>() {

    @Override
    public String toString(ActionEventHandler object) {
        return object == null ? "" : object.toString();
    }

    @Override
    public ActionEventHandler fromString(String string) {
        if (string == null) {
            return null;
        }
        for (ActionEventHandler h : data) {
            if (string.equals(h.toString())) {
                return h;
            }
        }
        return null;
    }

});
comboBox.getEditor().textProperty().addListener((observable, oldValue, newValue) -> {
    filtered.setPredicate(h -> h.toString().startsWith(newValue));
});
@FXML
private ComboBox<ActionEventHandler> autoBox;

@FXML
private void initialize() {
    autoBox.getItems().setAll(
            new ActionEventHandler("action1", this::action1),
            new ActionEventHandler("action2", this::action2),
            new ActionEventHandler("action3", this::action3));
    autoBox.setOnAction(event -> {
        ActionEventHandler h = autoBox.getValue();
        if (h != null) {
            h.handle(event);
        }
    });
    autoBox.setConverter(new StringConverter<ActionEventHandler>() {

        @Override
        public String toString(ActionEventHandler object) {
            return object == null ? "" : object.toString();
        }

        @Override
        public ActionEventHandler fromString(String string) {
            if (string == null) {
                return null;
            }
            for (ActionEventHandler h : autoBox.getItems()) {
                if (string.equals(h.toString())) {
                    return h;
                }
            }
            return null;
        }

    });
    new AutoCompleteBox<>(autoBox);
}