выравнивание текста в полях со списком - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть JavaFX ComboBox с несколькими вариантами текста.Было бы хорошо, если бы при выборе использовалось выравнивание по центру вместо выравнивания по левому краю, но я не понял, как это сделать.

Ниже приведен стиль, который я использую.Я добавил пункт "-fx-text-alignment: center;"но это не повлияло на размещение строк в выпадающем списке.

    normalStyle = "-fx-font-family:san serif;"
            + "-fx-font-size:12;"
            + "-fx-text-alignment:center;"
            + "-fx-font-weight:normal;";

Стиль прикреплен к комбинированному окну следующим образом:

     cbChoices.setStyle(normalStyle);

Я заметил, чтоРазмер и вес записей в поле со списком будут реагировать на изменения, описанные выше, но не на выравнивание.

Я бы предпочел не добавлять пробелы в начало моих строк, чтобы они выстроились в линию.Есть ли другой способ?

1 Ответ

0 голосов
/ 08 февраля 2019

Вам необходимо установить стиль для каждого отдельного ListCell внутри ComboBox, а не для самого ComboBox.

Вы можете сделать это, предоставив собственную реализацию ListCell с помощью setCellFactory() метод:

    // Provide our own ListCells for the ComboBox
    comboBox.setCellFactory(lv -> new ListCell<String>() {

        // We override the updateItem() method
        @Override
        protected void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);

            // Set the style for this ListCell
            setStyle("-fx-alignment: center");

            // If there is no item for this cell, leave it empty, otherwise show the text
            if (item != null && !empty) {
                setText(item);
            } else {
                setText(null);
            }
        }
    });

Пример приложения:

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

public class ComboBoxAlignment extends Application {

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

    @Override
    public void start(Stage primaryStage) {

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

        // Simple ComboBox with items
        ComboBox<String> comboBox = new ComboBox<>();
        comboBox.getItems().addAll("Red", "Orange", "Yellow", "Green", "Blue", "Indigo", "Violet");

        // Provide our own ListCells for the ComboBox
        comboBox.setCellFactory(lv -> new ListCell<String>() {

            // We override the updateItem() method
            @Override
            protected void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);

                // Set the style for this ListCell
                setStyle("-fx-alignment: center");

                // If there is no item for this cell, leave it empty, otherwise show the text
                if (item != null && !empty) {
                    setText(item);
                } else {
                    setText(null);
                }
            }
        });

        root.getChildren().add(comboBox);

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

Результат:

screenshot

...