Увеличить размер текста Combobox

У меня есть этот базовый пример поля со списком JavaFX:

public class JavaFXComboBox extends Application {

    @Override
    public void start(Stage primaryStage) {

        final ComboBox comboBox = new ComboBox();
        comboBox.getItems().addAll(
                "Item 1",
                "Item 2",
                "Item 3",
                "Item 4");
        comboBox.setValue("Item 1");

        final Label label = new Label();

        Button btn = new Button();
        btn.setText("Read comboBox");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                label.setText("selectd: " + comboBox.getValue());
            }
        });

        VBox vBox = new VBox();
        vBox.setPadding(new Insets(5, 5, 5, 5));
        vBox.setSpacing(5);
        vBox.getChildren().addAll(label, comboBox, btn);

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

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

Можете ли вы сказать мне, как я могу увеличить размер текста в поле со списком, но при этом сохранить исходный размер метки поля со списком?

введите здесь описание изображения


person Peter Penzov    schedule 25.12.2013    source источник


Ответы (3)


Создайте файл combo.css, например:

.combo-box-popup .list-view {
    -fx-font-size : 15pt;
}

/*added this in an edit*/
.combo-box-popup .list-view .list-cell {
    -fx-padding: -1 -1 -1 -1;
}

и добавьте строку scene.getStylesheets().add("javafxcombobox/combo.css"); после создания сцены.

введите здесь описание изображения

Некоторые фрагменты из caspian.css дадут вам возможность попробовать. Поиграйте с прокладкой и посмотрите, что произойдет.

.combo-box-popup .list-view {
-fx-background-color: -fx-box-border, -fx-control-inner-background;
-fx-background-insets: 0, 1;
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 8, 0.0 , 0 , 0 );
}

.combo-box-popup .list-view .list-cell {
-fx-padding: 4 0 4 5;
-fx-background-color: -fx-control-inner-background;
}

Я хотел бы знать, есть ли способ добавить подстили в comboBox.setStyle(), если кто-нибудь знает.

person brian    schedule 26.12.2013
comment
Да, это увеличивает размер списка, но также увеличивает ширину поля со списком. Как я могу предотвратить это? - person Peter Penzov; 26.12.2013
comment
@brian setStyle(...) применяет стиль только к узлу, на котором вы его вызываете. Вы можете получить ссылку на узлы ниже заданного узла в графе сцены, вызвав lookup(...) для узла, а затем вызвав setStyle(...) для него: comboBox.lookup(".combo-box-popup .list-view").setStyle("-fx-font-size: 15pt;");. Однако использование внешнего файла CSS намного лучше. - person James_D; 26.12.2013
comment
@James_D Я получаю NPE, используя этот код, но документация, кажется, предполагает, что это нормально. Возможно, это только для объявленных стилей с использованием #selector - person brian; 27.12.2013
comment
Извините: попробуйте comboBox.lookup(".list-view").setStyle(...); Точно не знаю, почему другой не работает. Возможно, вам придется сделать это после того, как сцена будет отрендерена (одна из причин, по которой лучше использовать внешний файл css). - person James_D; 27.12.2013

Вам просто нужно установить setCellFactory на вашем comboBox, как показано ниже, после его инициализации, как показано ниже -

   comboBox.setValue("Item 1");

        comboBox.setCellFactory(
                new Callback<ListView<String>, ListCell<String>>() {
                    @Override
                    public ListCell<String> call(ListView<String> param) {
                        final ListCell<String> cell = new ListCell<String>() {
                            @Override
                            public void updateItem(String item,
                                    boolean empty) {
                                super.updateItem(item, empty);
                                if (item != null) {
                                    setText(item);
                                    setFont(this.getFont().font(this.getFont().getName(), 30.0)); //set your desired size
                                } else {
                                    setText(null);
                                }
                            }
                        };
                        return cell;
                    }

                });

        final Label label = new Label();

Это поможет вам. Спасибо!!

person Neelam Sharma    schedule 27.12.2013

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

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;

/**
 *
 * @author reegan
 */
public class JavaFXComboBoxStack extends Application {

    @Override
    public void start(Stage primaryStage) {

        final ComboBox comboBox = new ComboBox();
        comboBox.getItems().addAll(
                "Item 1",
                "Item 2",
                "Item 3",
                "Item 4");
        comboBox.setValue( "Item 1");

       comboBox.setMaxWidth(10);


       comboBox.setMaxSize(25, 25);

        comboBox.setCellFactory(
                new Callback<ListView<String>, ListCell<String>>() {
            @Override
            public ListCell<String> call(ListView<String> param) {
                final ListCell<String> cell = new ListCell<String>() {
                    {
                        super.setPrefWidth(10); // Set Drop Down Width 
                    }

                    @Override
                    public void updateItem(String item,
                            boolean empty) {
                        super.updateItem(item, empty);
                        if (item != null) {
                            setText(item);

                        } else {
                            setText(null);
                        }
                    }
                };
                return cell;
            }
        });
        final Label label = new Label();

        Button btn = new Button();
        btn.setText("Read comboBox");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                label.setText("selectd: " + comboBox.getValue());
            }
        });

        VBox vBox = new VBox();
        vBox.setPadding(new Insets(5, 5, 5, 5));
        vBox.setSpacing(5);
        vBox.getChildren().addAll(label, comboBox, btn);

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

        Scene scene = new Scene(root, 300, 250);
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
person Reegan Miranda    schedule 26.12.2013
comment
Ссылка на этот пример: java2s.com/Code/Java/JavaFX/ - person Reegan Miranda; 26.12.2013