Java ChoiceDialog更改默认按钮顺序

4
与预期相反,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;
}
1个回答

1

对话框中的按钮排序(以及对话框面板)可以按以下方式配置:

  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 );
  }
}

设置

设置包括以下属性定义

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 的排序方式)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接