有没有办法动态更改ComboBox

时间:2016-03-31 15:35:02

标签: java dynamic drop-down-menu javafx combobox

考虑以下MCVE:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.stage.Stage;

public class MCVE extends Application {

    @Override
    public void start(Stage stage) {

        ComboBox<String> box = new ComboBox<String>();
        box.setEditable(true);

        ObservableList<String> list = FXCollections.observableArrayList();
        box.setItems(list);

        box.getEditor().textProperty().addListener((obs, oldValue, newValue) -> {
            // Clear the list
            list.clear();
            int rows = 0;

            // Add a dummy item to the list for every character i newValue.
            for (int i = 0; i < newValue.length() && newValue.length() < 10; i++) {
                list.add(i+"");
                rows++;
            }

            // Does not work.
            box.setVisibleRowCount(rows);
        });

        stage.setScene(new Scene(box));
        stage.show();
    }

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

当您向ComboBox添加一些字符时,列表中的项目数量会增加。但是下拉列表中可见行的数量不会改变。要进行更改,您需要隐藏并显示下拉列表。当列表中的项目数量减少时,也会出现此问题。

在我看来,这应该是动态变化的。

bug report似乎涵盖了一个类似的问题。虽然在这种情况下,隐藏后显示下拉列表时问题仍然存在,但在我的示例中并非如此。

thread提出了类似的问题,但问题是当您隐藏后显示下拉列表时setVisibleRowCount()无效的原因。相反,我的是如何在显示下拉列表时实际完成动态更改的行数。我还尝试了上面链接线程中提供的修复,既设置ComboBox列表单元格的单元格大小,又设置另一个visibleRowCount,然后再将其设置为实际值以触发更新。似乎都没有用。

可能的解决方法是在列表大小更改时隐藏并显示下拉列表,但这会导致下拉闪烁,这很烦人。

列表应该保留某种允许的最大可见行,就像默认实现一样。

经测试的环境:Windows 8.1 Enterprise,Java 8u74。

0 个答案:

没有答案