User interface 如何在JavaFX中设置组合框下拉框的宽度?
myUser interface 如何在JavaFX中设置组合框下拉框的宽度?,user-interface,javafx,User Interface,Javafx,my组合框的下拉列表将扩展到输入的最大元素的大小。然而,我希望它是一个固定的大小 --------------------- | Small Combobox | V | -------------------------------------------- | "Long item 1" | -------------------------------------------- | "Long item
组合框的下拉列表将扩展到输入的最大元素的大小。然而,我希望它是一个固定的大小
---------------------
| 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){}并从那里编辑标签,而不是每次在同一标签的图形中设置一个新标签tryprefWidth()
?是的,我尝试过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;
}
});