Java ChoiceDialog更改默认按钮顺序

时间:2016-11-08 20:05:49

标签: 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;
}

1 个答案:

答案 0 :(得分:1)

对话框(和对话框窗格)上的按钮排序可按如下方式配置:

  1. 创建ChoiceDialog的子类(例如CattleGenderDialog
  2. 创建DialogPane的子类(例如ButtonOrderPane)。
  3. CattleGenderDialog的DialogPane设置为使用ButtonOrderPane
  4. 按首选顺序拥有ButtonOrderPane个返回按钮。
  5. 一旦理解了类关系,代码就很简单了。

    CattleGenderDialog Class

    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 Class

    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订购。)