Java ChoiceDialog 更改默认按钮顺序

标签 java javafx

与预期相反,ChoiceDialog 中按钮的默认顺序是左侧的“取消”和右侧的“确定”。

在这种方法中,我创建了一个对话框,其中列出了牛的性别(奶牛、小母牛、阉牛等)。使用默认对话框一切正常,除了按钮顺序与我构建的所有其他自定义构建对话框相反。

我相信“Java 外观设计指南”要求对话框的左边是“确定”,右边是“取消”。

无论如何,正如下面的代码所示,我已经尝试设置自己的按钮。 更改它们的添加顺序没有任何区别。

但是,如果 ButtonData.OTHER,我可以得到我想要的顺序,但是我没有得到想要的结果(选择的性别)。

我真正想做的就是更改按钮顺序,并获得所需的结果。

public static final String getChoice_Sex()
{
    String sex = "";
    List<String> list_Sexs = LM_Constant.getList_Sexs();

    ChoiceDialog<String> dialog = new ChoiceDialog<>(list_Sexs.get(0), list_Sexs);
    dialog.setTitle("Sex");
    dialog.setHeaderText("Please choose one.");
    dialog.setContentText("From this list:");

    //ButtonType button_OK = new ButtonType("OK", ButtonData.OK_DONE); 
    //ButtonType button_OK = new ButtonType("OK", ButtonData.OTHER); 
    //ButtonType button_Cancel = new ButtonType("Cancel", ButtonData.CANCEL_CLOSE);

    //dialog.getDialogPane().getButtonTypes().clear();
    //dialog.getDialogPane().getButtonTypes().add(button_Cancel);
    //dialog.getDialogPane().getButtonTypes().add(button_OK);
    //dialog.getDialogPane().getButtonTypes().add(button_Cancel);

    Optional<String> result = dialog.showAndWait();        
    if (result.isPresent())
        sex = result.get();

    return sex;
}

最佳答案

对话框(和对话框 Pane )上的按钮顺序可以配置如下:

  1. 创建 ChoiceDialog 的子类(例如,CattleGenderDialog)
  2. 创建 DialogPane 的子类(例如,ButtonOrderPane)。
  3. CattleGenderDialog 的 DialogPane 设置为使用 ButtonOrderPane
  4. ButtonOrderPane 按首选顺序返回按钮。

一旦理解了类关系,代码就很简单了。

CattleGenderDialog 类

public class CattleGenderDialog extends ChoiceDialog {
  public CattleGenderDialog( final Window owner ) {
    initOwner( owner );

    // This is the key line to override button order.
    setDialogPane( new ButtonOrderPane() );

    // This line will return the button order pane.
    final DialogPane dialogPane = getDialogPane();
    dialogPane.setContent( pane );
    dialogPane.getButtonTypes().addAll( ... );
  }
}

ButtonOrderPane 类

import static javafx.scene.control.ButtonBar.BUTTON_ORDER_WINDOWS;

public class ButtonOrderPane extends DialogPane {

  // This is where the revised button order is defined.
  @Override
  protected Node createButtonBar() {
    final ButtonBar node = (ButtonBar)super.createButtonBar();
    node.setButtonOrder( getButtonOrder() );
    return node;
  }

  private String getButtonOrder() {
    return getSetting( "dialog.alert.button.order.windows", BUTTON_ORDER_WINDOWS );
  }

  private String getSetting( final String key, final String defaultValue ) {
    return getSettings().getSetting( key, defaultValue );
  }

  // How you load the settings is up to you; I prefer decoupled code.
  private Settings getSettings() {
    return Services.load( Settings.class );
  }
}

设置

设置包括以下property definitions :

dialog.alert.button.order.mac=L_HE+U+FBIX_NCYOA_R
dialog.alert.button.order.linux=L_HE+UNYACBXIO_R
dialog.alert.button.order.windows=L_E+U+FBXI_YNOCAH_R

这允许跨应用程序保持一致的按钮,独立于平台,同时让用户可以灵活地选择他们喜欢的按钮顺序。 (也许 Mac 用户更喜欢 Linux 顺序。)

关于Java ChoiceDialog 更改默认按钮顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40495484/

相关文章:

java - 识别 Web 应用程序的请求设备

java - ComboBox ChangeListener 在 AutoCompleteDropDown 中被调用 3 次

JavaFX 'CSS' :WARNING: Could not resolve 'accent_color' while resolving lookups for '-fx-highlight-fill' from rule '*.text-input'

java - 加密文件目录的最佳方法?

java - 扫描仪使 catch 语句崩溃

java - 如果键是 Integer 类型,HashMap 条目是否总是按键排序?

java - 如何向 javafx 添加勾号?

JavaFx:使 ChangeListener 无效

javafx - JavaFX 1.3 知识如何转移到 JavaFX 2.0?

java - 将嵌套循环转换为 Java 8 流