使 JavaFX 中的组合框以非缩进方式显示缩进文本项

Make combo box in JavaFX display indented text items in a non-indented way

所以我正在使用 ComboBox 创建一个项目列表,用户可以从中选择一个。该列表是 hierarchical/indented 的方式如下:

Header 1
    Item 1
    Item 2
    Header 1.1
        Item 1
        Item 2
Header 2
    Item 1
    Item 2

这看起来不错,但是问题来了。当用户单击其中一个缩进项目时,该项目将显示缩进。例如,ComboBox 显示以下内容:

  Item 1

看起来真的很糟糕。我希望它像这样显示(没有前面的缩进):

项目 1

运行 程序的代码:

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception {
    // Parent root = FXMLLoader.load(getClass().getResource("interface.fxml"));

    ComboBox<String> genre1AddBook = new ComboBox<String>();
    ObservableList<String> genresAddBook;
    genresAddBook = FXCollections.observableArrayList("SKÖNLITTERATUR", "\tDeckare", "\tFantasy");
    genre1AddBook.getItems().addAll(genresAddBook);

    StackPane root = new StackPane();
    root.getChildren().add(genre1AddBook);

    primaryStage.setTitle("Hello World");
    primaryStage.setScene(new Scene(root, 400, 300));
    primaryStage.show();
}

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

}

如何让 ComboBox 显示没有缩进的缩进项,并且仍然显示 hierarchical/indented 结构?

鉴于您发布的 class,您可以在组合框中使用 buttonCell 从字符串中去除空格。

genre1AddBook.setButtonCell(new ListCell<>() {

    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty) ;
        if (empty || item == null) {
            setText("");
        } else {
            setText(item.stripLeading());
        }
    }
});

但这是一个非常糟糕的设计;我假设在您的实际应用程序中,如果组合框中的值具有与之关联的其他数据(例如父或层次结构中的子节点)。您应该在组合框上设置一个单元格工厂,根据它们在层次结构中的位置缩进下拉列表中的单元格,以及一个不缩进文本的按钮单元格。