Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 如何在JavaFX中设置组合框下拉框的宽度?_User Interface_Javafx - Fatal编程技术网

User interface 如何在JavaFX中设置组合框下拉框的宽度?

User interface 如何在JavaFX中设置组合框下拉框的宽度?,user-interface,javafx,User Interface,Javafx,my组合框的下拉列表将扩展到输入的最大元素的大小。然而,我希望它是一个固定的大小 --------------------- | Small Combobox | V | -------------------------------------------- | "Long item 1" | -------------------------------------------- | "Long item

my
组合框的下拉列表将扩展到输入的最大元素的大小。然而,我希望它是一个固定的大小

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

使用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;
}
注意:我只在Java8上测试了这个示例,我相信
-fx-*-width
-fx-*-height
css属性对于JavaFX 8可能是新的

示例用法

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

导入javafx.application.application;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.ComboBox;
导入javafx.scene.layout.StackPane;
导入javafx.scene.text.Font;
导入javafx.stage.stage;
公共类SizedComboBoxSampleWithCss扩展应用程序{
公共静态void main(字符串[]args){launch(args);}
@覆盖公共无效开始(阶段){
最终组合框combo=新组合框();
setValue(Font.getDefault().getFamily());
combo.getItems().setAll(Font.getFamilies());
combo.getStylesheets().add(
getClass().getResource(
“组合大小.css”
).toExternalForm()
);
StackPane布局=新的StackPane(组合);
布局。设置填充(新插图(10));
舞台场景(新场景(布局));
stage.show();
}
}
珠宝海的解决方案第一次对我不起作用,因此,如果有人需要解决问题,这里是我的解决方案。我只是提供了一个自定义单元格工厂,我可以访问父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;
        }
    });
combo.setCellFactory(新回调(){
@凌驾
公共ListCell调用(ListView参数){
ListCell=新ListCell(){
@凌驾
public void updateItem(T项,布尔值为空){
super.updateItem(项,空);
getListView().setMaxWidth(列表视图最大高度);
如果(!空){
setText(converter.toString(项目));
}否则{
setText(空);
}
}
};
返回单元;
}
});
combo.setCellFactory(新回调(){
@凌驾
公共ListCell调用(ListView参数){
ListCell=新ListCell(){
@凌驾
public void updateItem(T项,布尔值为空){
如果(!空){
标签标签=新标签(转换器toString(项目));
label.setMaxWidth(comboBox.getWidth());
label.setWrapText(true);
设置图形(标签);
setText(空);
}否则{
设置图形(空);
setText(空);
}
}
};
返回单元;
}
});
这里的其他答案不适合我。这是一种肮脏的做法,但它奏效了


编辑:或者您可以获取children()和if(node instanceof Label){}并从那里编辑标签,而不是每次在同一标签的图形中设置一个新标签

try
prefWidth()
?是的,我尝试过prefWidth()是设置组合框的大小,而不是它的下拉列表。您是否有一个SSCE-供您支持?是javax吗。​swing.JComboBox或javafx。​场景​控件。组合框?javafx。​场景​控制,很好!奇怪的是:它不适用于
-fx max width
,也不适用于没有在组合框本身上设置首选宽度的情况。设置maxWidth不知何故对我没有任何作用,但它可以设置prefWidth。。。
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;
        }
    });
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;
    }
});