考虑以下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。