JavaFX对话框控件-ChoiceDialog
- 与Alert大部分功能类似
- 按钮不可以自定义
- 多一个下拉框
常用属性
title
弹出框标题,标题太长会把超长部分截取,后面加上
……
dialog.setTitle("标题");
contentText
弹出框内容,内容太多,不会被截取,会把弹出框撑变形
dialog.setContentText("内容信息");
initOwner
设置弹框的所有者,用于确定对话框的位置和模式
dialog.initOwner(stage);
graphic
设置弹出框的小图标,否则会采用AlertType默认图标
dialog.setGraphic(new ImageView("icon.png"));
headerText
设置弹框的头部信息,否则会使用AlertType默认信息
dialog.setHeaderText("headerText信息");
defaultValue
弹框中下拉框的默认值,通过构造方法赋值
ChoiceDialog<String> dialog = new ChoiceDialog<String>("选项2", "选项1", "选项2", "选项3", "选项4");
// 设置选择值
dialog.setSelectedItem("选项3");
// 获取默认值
dialog.getDefaultChoice();
choices
弹框中下拉框选项值,通过构造方法赋值
ChoiceDialog<String> dialog = new ChoiceDialog<String>("选项2", "选项1", "选项2", "选项3", "选项4");
dialogPane
获取 Alert 的内部 DialogPane,允许进一步定制对话框的布局和内容,其中最重要的是
expandableContent
TextArea textArea = new TextArea("展开显示详细内容");
textArea.setEditable(false);
textArea.setWrapText(true);
textArea.setMaxWidth(Double.MAX_VALUE);
textArea.setMaxHeight(Double.MAX_VALUE);
dialog.getDialogPane().setExpandableContent(textArea);
常用事件
显示事件setOnShowing
dialog.setOnShowing((e) -> {
System.out.println(e.getEventType() + " ->" + e.getSource().getClass() + " -> " + e.getTarget().getClass());
});
显示事件setOnShown
dialog.setOnShown((e) -> {
System.out.println(e.getEventType() + " ->" + e.getSource().getClass() + " -> " + e.getTarget().getClass());
});
弹框按钮点击
Optional<String> optional = dialog.showAndWait();
System.out.println(optional.orElse("无"));
综合案例
public static Parent demo1(Window owner) {
FlowPane flowPane = new FlowPane();
flowPane.setHgap(10);
flowPane.setVgap(10);
flowPane.setOrientation(Orientation.VERTICAL);
Button button1 = new Button("demo1");
button1.setOnMouseClicked((event) -> {
if (MouseButton.PRIMARY.equals(event.getButton())) {
ChoiceDialog<String> dialog = new ChoiceDialog<String>("选项2", "选项1", "选项2", "选项3", "选项4");
dialog.initOwner(owner);
dialog.setTitle("title信息");
dialog.setHeaderText("headerText信息");
dialog.setContentText("请选择:");
dialog.setGraphic(new ImageView("icon.png"));
TextArea textArea = new TextArea("展开显示详细内容");
textArea.setEditable(false);
textArea.setWrapText(true);
textArea.setMaxWidth(Double.MAX_VALUE);
textArea.setMaxHeight(Double.MAX_VALUE);
dialog.getDialogPane().setExpandableContent(textArea);
dialog.setOnShowing((e) -> {
System.out.println(e.getEventType() + " ->" + e.getSource().getClass() + " -> " + e.getTarget().getClass());
});
dialog.setOnShown((e) -> {
System.out.println(e.getEventType() + " ->" + e.getSource().getClass() + " -> " + e.getTarget().getClass());
});
Optional<String> optional = dialog.showAndWait();
System.out.println(optional.orElse("无"));
}
});
flowPane.getChildren().add(button1);
return flowPane;
}
自定义下拉框内容
目前自带的只能是一个纯文本,目前
ChoiceDialog
没有提供对内部ComboBox
的自定义操作方案,我们可以通过反射方式来处理
Field field = ChoiceDialog.class.getDeclaredField("comboBox");
field.setAccessible(true);
ComboBox comboBox = (ComboBox) field.get(dialog);
comboBox.setCellFactory(param -> new ListCell<String>() {
@Override
protected void updateItem(String txt, boolean empty) {
super.updateItem(txt, empty);
if (empty || txt == null) {
setGraphic(null);
} else {
VBox vBox = new VBox();
vBox.setPadding(new Insets(5, 2, 2, 5));
vBox.getChildren().addAll(new Text("测试->" + txt));
setGraphic(vBox);
}
}
});