[英]JavaFX default focused button in Alert Dialog
从jdk 8u40开始,我正在使用新的javafx.scene.control.Alert
API来显示确认对话框。 在下面的示例中,默认情况下“是”按钮而不是“否”按钮:
public boolean showConfirmDialog(String title, String header, String content, AlertType alertType) {
final Alert alert = new Alert(alertType);
alert.setTitle(title);
alert.setHeaderText(header);
alert.setContentText(content);
alert.getButtonTypes().clear();
alert.getButtonTypes().addAll(ButtonType.YES, ButtonType.NO);
final Optional<ButtonType> result = alert.showAndWait();
return result.get() == ButtonType.YES;
}
我不知道如何改变它。
编辑:
这里是默认情况下聚焦“是”按钮的结果屏幕截图:
我不确定以下是否通常这样做,但你可以通过查找按钮并自己设置默认行为来更改默认按钮:
public boolean showConfirmDialog(String title, String header, String content, AlertType alertType) {
final Alert alert = new Alert(alertType);
alert.setTitle(title);
alert.setHeaderText(header);
alert.setContentText(content);
alert.getButtonTypes().clear();
alert.getButtonTypes().addAll(ButtonType.YES, ButtonType.NO);
//Deactivate Defaultbehavior for yes-Button:
Button yesButton = (Button) alert.getDialogPane().lookupButton( ButtonType.YES );
yesButton.setDefaultButton( false );
//Activate Defaultbehavior for no-Button:
Button noButton = (Button) alert.getDialogPane().lookupButton( ButtonType.NO );
noButton.setDefaultButton( true );
final Optional<ButtonType> result = alert.showAndWait();
return result.get() == ButtonType.YES;
}
crusam的一个简单功能:
private static Alert setDefaultButton ( Alert alert, ButtonType defBtn ) {
DialogPane pane = alert.getDialogPane();
for ( ButtonType t : alert.getButtonTypes() )
( (Button) pane.lookupButton(t) ).setDefaultButton( t == defBtn );
return alert;
}
用法:
final Alert alert = new Alert(
AlertType.CONFIRMATION, "You sure?", ButtonType.YES, ButtonType.NO );
if ( setDefaultButton( alert, ButtonType.NO ).showAndWait()
.orElse( ButtonType.NO ) == ButtonType.YES ) {
// User selected the non-default yes button
}
如果你看一下(私有) ButtonBarSkin
类,有一个名为doButtonOrderLayout()
的方法,它根据一些默认的OS行为执行按钮的布局。
在里面,你可以读到这个:
/ *现在所有按钮都已放置,我们需要确保焦点设置在正确的按钮上。 [...]如果是这样,我们请求关注此默认按钮。 * /
由于ButtonType.YES
是默认按钮,因此它将成为焦点。
所以@ymene的答案是正确的:你可以改变默认行为,然后专注的那个将是NO
。
或者您可以通过在buttonOrderProperty()
设置BUTTON_ORDER_NONE
来避免使用该方法。 现在第一个按钮将具有焦点,因此您需要先放置NO
按钮。
alert.getButtonTypes().setAll(ButtonType.NO, ButtonType.YES);
ButtonBar buttonBar=(ButtonBar)alert.getDialogPane().lookup(".button-bar");
buttonBar.setButtonOrder(ButtonBar.BUTTON_ORDER_NONE);
请注意, YES
仍将具有默认行为:这意味着可以使用空格键(聚焦按钮)选择NO
,如果按Enter键(默认按钮),则选择YES
。
或者您也可以更改@crusam回答后的默认行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.