我试图居中对齐列表视图的内容
private ListView<String> library = new ListView<String>();
ObservableList<String> libraryList = FXCollections.<String>observableArrayList();
我已经找到了使用CSS和XML进行编码的方法,但是我正在寻找使用Java进行编码的方法,有人有什么想法吗?
答案 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实现。
这也许可以简化,我欢迎评论和编辑!