如何设置java fx中组合框下拉的宽度

时间:2014-03-05 06:34:22

标签: user-interface javafx

我的组合框下拉列表会扩展到其中输入的最大元素的大小,但我希望它具有固定大小。

---------------------
| Small Combobox | V |
--------------------------------------------
| "Long item 1"                              |
--------------------------------------------
| "Long item 2"                              |
 --------------------------------------------
| "Long item 3"                              |
 --------------------------------------------

3 个答案:

答案 0 :(得分:11)

使用CSS

/** file: combo-size.css */

/** Size the combo-box button. */
.combo-box {
    -fx-pref-width: 100;
}

/** Size the combo-box drop down list. */
.combo-box-popup > .list-view {
    -fx-pref-width: 100;
}

注意:我仅在Java 8上测试了此示例,我相信-fx-*-width-fx-*-height css属性可能是JavaFX 8 的新属性。

样本使用

在此示例中,组合框按钮和下拉列表的大小均为相同的首选宽度(100像素)。

enter image description here

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class SizedComboBoxSampleWithCss extends Application {
    public static void main(String[] args) { launch(args); }

    @Override public void start(Stage stage) {
        final ComboBox<String> combo = new ComboBox<>();

        combo.setValue(Font.getDefault().getFamily());
        combo.getItems().setAll(Font.getFamilies());
        combo.getStylesheets().add(
                getClass().getResource(
                        "combo-size.css"
                ).toExternalForm()
        );

        StackPane layout = new StackPane(combo);
        layout.setPadding(new Insets(10));

        stage.setScene(new Scene(layout));
        stage.show();
    }
}

答案 1 :(得分:4)

jewelsea的解决方案第一次对我不起作用,所以如果有人需要解决方案,这是我的解决方案。我只提供一个自定义单元工厂,然后我可以访问父ListView并在其中设置maxWidth。

combo.setCellFactory(new Callback<ListView<T>, ListCell<T>>() {

        @Override
        public ListCell<T> call(ListView<T> param) {
            ListCell cell = new ListCell<T>() {
                @Override
                public void updateItem(T item, boolean empty) {
                    super.updateItem(item, empty);

                    getListView().setMaxWidth(LIST_VIEW_MAX_HEIGHT);
                    if (!empty) {
                        setText(converter.toString(item));
                    } else {
                        setText(null);
                    }
                }
            };
            return cell;
        }
    });

答案 2 :(得分:0)

combo.setCellFactory(new Callback<ListView<T>, ListCell<T>>() {

    @Override
    public ListCell<T> call(ListView<T> param) {
        ListCell cell = new ListCell<T>() {
            @Override
            public void updateItem(T item, boolean empty) {
                if (!empty) {
                    Label label = new Label(converter.toString(item));
                    label.setMaxWidth(comboBox.getWidth());
                    label.setWrapText(true);
                    setGraphic(label);
                    setText(null);

                } else {
                    setGraphic(null);
                    setText(null);
                }
            }
        };
        return cell;
    }
});

这里的其他答案对我不起作用。这是一种肮脏的方式,但是有效。

编辑:或者您可以getChildren()和if(标签的节点实例){}并从那里编辑标签,而不是每次都在同一标签的图形中设置一个新标签