我想对齐(即位置中心)对话框窗格的“确定”按钮。我已经尝试过下面的代码,但它不起作用。
Dialog dialog = new Dialog();
DialogPane dialogPane = dialog.getDialogPane();
dialogPane.setStyle("-fx-background-color: #fff;");
// Set the button types.
ButtonType okButtonType = new ButtonType("Ok", ButtonBar.ButtonData.OK_DONE);
ButtonType cancelButtonType = new ButtonType("Cancel", ButtonBar.ButtonData.CANCEL_CLOSE);
dialog.getDialogPane().getButtonTypes().addAll(okButtonType, cancelButtonType);
dialogPane.lookupButton(cancelButtonType).setVisible(false);
// Testing
Button okButton = (Button) dialog.getDialogPane().lookupButton(okButtonType);
okButton.setAlignment(Pos.CENTER);
// End Testing
dialog.showAndWait();
实际上,以非 hacky 的方式实现对话框 ButtonBar 中的按钮居中实际上非常困难。
以下是我能想到的最佳解决方案。它依赖于一个动态 CSS 查找 https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Node.html#lookup-java.lang.String-按钮容器的 HBox 的,然后在右侧添加一个间隔区域以将按钮推到左侧(默认的 ButtonSkin 实现已经放置了左侧的隐式间隔,它将按钮推到右侧,我确定使用优美的风景 http://fxexperience.com/scenic-view/)。左右垫片的组合最终将按钮对齐在中心。该解决方案还覆盖 ButtonBar 创建,以停止 ButtonSkin 内部重新排序和执行额外的按钮布局,因为当它这样做时,您无法真正可靠地自己自定义布局。
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import java.util.Optional;
public class CenteredDialogButtons extends Application {
@Override
public void start(Stage stage) {
Button show = new Button("Show Dialog");
Dialog<ButtonType> dialog = new Dialog<>();
DialogPane dialogPane = new DialogPane() {
@Override
protected Node createButtonBar() {
ButtonBar buttonBar = (ButtonBar) super.createButtonBar();
buttonBar.setButtonOrder(ButtonBar.BUTTON_ORDER_NONE);
return buttonBar;
}
};
dialog.setDialogPane(dialogPane);
dialogPane.getButtonTypes().addAll(ButtonType.OK);
dialogPane.setContentText("Centered Button");
Region spacer = new Region();
ButtonBar.setButtonData(spacer, ButtonBar.ButtonData.BIG_GAP);
HBox.setHgrow(spacer, Priority.ALWAYS);
dialogPane.applyCss();
HBox hbox = (HBox) dialogPane.lookup(".container");
hbox.getChildren().add(spacer);
show.setOnAction(e -> {
Optional<ButtonType> result = dialog.showAndWait();
if (result.isPresent() && result.get() == ButtonType.OK) {
System.out.println("OK");
}
});
StackPane layout = new StackPane(
show
);
layout.setPadding(new Insets(50));
Scene scene = new Scene(layout);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我不太喜欢这个解决方案的原因是动态 CSS 查找有点违反 API 封装,因为按钮栏等控件的 JavaFX 场景图的 CSS 结构并不是其公共 API 的真正一部分。但是,我认为使用 JavaFX 8 的现有公共 API 和默认 ButtonBar 皮肤确实不可能在 ButtonBar 中获得居中按钮。
另一种方法是为与对话框关联的 ButtonBar 创建自定义外观,但该方法非常困难,我不建议将其用于此任务。
基本上,所有这一切的要点是,尽可能保留默认的按钮布局和对话框顺序,而不是尝试自定义对话框按钮布局。如果您确实希望在按钮放置等级别上拥有完全自定义的布局,那么您最好通过子类化 Stage 来创建自己的自定义对话框类,而不是基于内置对话框类实现自定义对话框。
相关但略有不同的信息位于:
- 输入键事件在 Javafx 对话框中不起作用? https://stackoverflow.com/questions/35458089/enter-key-event-is-not-working-on-dialog-in-javafx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)