使用JavaFX对齐Listview的内容

时间:2018-07-28 18:47:38

标签: listview javafx alignment

我试图居中对齐列表视图的内容

private ListView<String> library = new ListView<String>();
ObservableList<String> libraryList = FXCollections.<String>observableArrayList();

我已经找到了使用CSS和XML进行编码的方法,但是我正在寻找使用Java进行编码的方法,有人有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您需要为CellFactory使用自定义ListCell和自定义ListView

这是一个完整的示例:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

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

    @Override
    public void start(Stage primaryStage) {

        // Simple UI
        VBox root = new VBox(10);
        root.setAlignment(Pos.CENTER);
        root.setPadding(new Insets(10));

        ListView<String> listView = new ListView<>();

        // Setup the cell factory for the listview. It will hold lists of HBoxes that can be aligned
        listView.setCellFactory(stringListView -> new CenteredListViewCell());

        // Sample data
        listView.getItems().setAll("One", "Two", "Three", "Four");

        root.getChildren().add(listView);

        // Show the stage
        primaryStage.setScene(new Scene(root));
        primaryStage.setWidth(300);
        primaryStage.setHeight(300);
        primaryStage.show();
    }
}

final class CenteredListViewCell extends ListCell<String> {
    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if (empty) {
            setGraphic(null);
        } else {
            // Create the HBox
            HBox hBox = new HBox();
            hBox.setAlignment(Pos.CENTER);

            // Create centered Label
            Label label = new Label(item);
            label.setAlignment(Pos.CENTER);

            hBox.getChildren().add(label);
            setGraphic(hBox);
        }
    }
}

您正在做的是创建一个自定义CenteredListViewCell,它使用HBox作为主要内容。设置HBox的对齐方式可以使Label在其中居中。

然后在控制器中插入listView.setCellFactory(stringListView -> new CenteredListViewCell());,您告诉ListView使用自定义单元而不是标准Java实现。

这也许可以简化,我欢迎评论和编辑!