首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >警报对话框中的JavaFX默认聚焦按钮

警报对话框中的JavaFX默认聚焦按钮
EN

Stack Overflow用户
提问于 2015-04-09 17:59:52
回答 3查看 11.6K关注 0票数 14

从JDK8u40开始,我使用新的javafx.scene.control.Alert应用程序接口来显示确认对话框。在下面的示例中,默认选择是按钮,而不是否按钮:

代码语言:javascript
运行
复制
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;
}

我不知道该怎么改变它。

编辑:

这是默认情况下"Yes“按钮被聚焦的结果截图:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-09 18:50:48

我不确定下面是不是通常的方法,但你可以通过查找按钮并自己设置默认行为来更改默认按钮:

代码语言:javascript
运行
复制
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;
}
票数 20
EN

Stack Overflow用户

发布于 2015-04-22 14:43:38

一个简单的函数,这要归功于crusam:

代码语言:javascript
运行
复制
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;
}

用法:

代码语言:javascript
运行
复制
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
}
票数 7
EN

Stack Overflow用户

发布于 2015-04-09 19:15:54

如果您查看一下(私有) ButtonBarSkin类,就会发现有一个名为doButtonOrderLayout()的方法,它根据一些默认的OS行为执行按钮的布局。

在它里面,你可以读到这个:

/*现在所有按钮都已放置,我们需要确保将焦点设置在正确的按钮上。..。如果是这样,我们请求将焦点放在这个默认按钮上。*/

由于ButtonType.YES是默认按钮,因此它将成为焦点按钮。

所以@ymene的答案是正确的:你可以更改默认行为,然后聚焦的行为将是NO

或者,您可以通过在buttonOrderProperty()中设置BUTTON_ORDER_NONE来避免使用这种方法。现在第一个按钮将获得焦点,因此您需要首先放置NO按钮。

代码语言:javascript
运行
复制
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 answer后面的默认行为。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29535395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档