当值保持不变时,将更改侦听器添加到ComboBox

时间:2014-12-17 06:09:52

标签: java combobox javafx

我有一个ComboBox(JavaFX),它根据所选的字符串显示数据库中的信息。 例如:ComboBox中的值如下:

  • 表1
  • 表2

如果选择了表1,然后选择表2,则会检测到值更改并运行代码。

但是当我选择表1并重新选择表1时,未检测到值更改。相反,我希望代码从源数据库重新加载表。

当前代码:

myComboBox.valueProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue ov, String t, String t1) {
        myComboBoxValue = t1;
        if (t1 != null) {
            displayTable(t1)
        } 
    }
});

3 个答案:

答案 0 :(得分:1)

如果旧的选定值等于新值,则不会触发侦听器。但是,如果这是您想要的,则可以在单击组合框后清除所选值。

myComboBox.valueProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue ov, String t, String t1) {
        myComboBoxValue = t1;
        if (t1 != null) {
            displayTable(t1)
        } 
    }
});

myComboBox.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                myComboBox.getSelectionModel().clearSelection();

            }
        });

答案 1 :(得分:1)

无论是否选择了新项目,都可以在ComboBox中对项目选择作出反应的工作方法:https://stackoverflow.com/a/25704438/4749209

基于此解决方案,您的示例代码将保持如下:

myComboBox.showingProperty().addListener((ov, old_show_state, new_show_state) ->
{
    // checks if the combobox popup menu was closed
    if (new_show_state == false)
    {
        myComboBoxValue = myComboBox.getValue();
        if (myComboBoxValue != null)
        {
            displayTable(myComboBoxValue)
        }
    } 
});

唯一需要提及的问题是,如果用户在组合框弹出式菜单区域外单击,则会发生您提到的重新加载操作,因为它也会关闭。

答案 2 :(得分:0)

当值保持不变时,不会更改值,因此不会触发任何事件。根据你的目的,你可以做到。 G。添加一个监听器onHidden。这很难看,也不包括e。 G。当您以编程方式设置相同的值,但通过鼠标单击可以进行更改。