我的组合框下拉列表会扩展到其中输入的最大元素的大小,但我希望它具有固定大小。
---------------------
| Small Combobox | V |
--------------------------------------------
| "Long item 1" |
--------------------------------------------
| "Long item 2" |
--------------------------------------------
| "Long item 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像素)。
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(标签的节点实例){}并从那里编辑标签,而不是每次都在同一标签的图形中设置一个新标签