【问题标题】:JavaFX - how to know if cancel was pressedJavaFX - 如何知道是否按下了取消
【发布时间】:2015-10-18 20:44:18
【问题描述】:

我如何知道在此 JavaFX 对话框中按下的是确定按钮还是取消按钮。

对话代码:

public String delimiter;

public void delimiterYES() throws IOException {
    delimiter=new String();
    TextInputDialog dialog = new TextInputDialog();
    dialog.setTitle("Delimiter");
    dialog.setHeaderText("Enter the delimiter");

    Optional<String> result = dialog.showAndWait();
    if (result.isPresent()) {
        delimiter=result.get();
    }
}

【问题讨论】:

  • Javadoc 对此并不清楚。考虑提出问题:bugs.java.com

标签: java javafx dialog cancel-button


【解决方案1】:

您可以使用Optional&lt;ButtonType&gt; 代替Optional&lt;String&gt;。并且基本上使用下面的代码。

 Optional<ButtonType> result = dialog.showAndWait();
    if (result.isPresent() &&  result.get()  == ButtonType.OK){
        System.out.println("Ok button is pressed");
    } else if(result.isPresent() &&  result.get()  == ButtonType.CANCEL){
        System.out.println("Cancel button was pressed");
    }

希望对您有所帮助。如果您需要任何进一步的说明,请告诉我。

【讨论】:

    【解决方案2】:

    如果存在结果,则用户按下确定。如果没有结果,那么用户可能按下了取消,但他们可能刚刚使用操作系统关闭窗口功能关闭了对话窗口。

    Optional<String> result = new TextInputDialog().showAndWait();
    if (result.isPresent()) {
        // ok was pressed.
    } else {
        // cancel might have been pressed.
    }
    

    要真正了解按钮是否被按下,您可以使用Dialog javadoc 部分“对话框验证/拦截按钮操作”中所述的过滤器。

    final Button cancel = (Button) dialog.getDialogPane().lookupButton(ButtonType.CANCEL);
    cancel.addEventFilter(ActionEvent.ACTION, event ->
        System.out.println("Cancel was definitely pressed")
    );
    

    示例代码:

    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.scene.Scene;
    import javafx.scene.control.*;
    import javafx.stage.Stage;
    
    import java.util.Optional;
    
    public class DialogSample extends Application {
        @Override
        public void start(Stage stage) throws Exception {
            Button showButton = new Button("show");
            showButton.setOnAction(event -> showDialog(stage));
            showButton.setPrefWidth(100);
            stage.setScene(new Scene(showButton));
            stage.show();
    
            showButton.fire();
        }
    
        private void showDialog(Stage stage) {
            TextInputDialog dialog = new TextInputDialog();
            dialog.initOwner(stage);
            dialog.setTitle("Delimiter");
            dialog.setHeaderText("Enter the delimiter");
    
            final Button ok = (Button) dialog.getDialogPane().lookupButton(ButtonType.OK);
            ok.addEventFilter(ActionEvent.ACTION, event ->
                System.out.println("OK was definitely pressed")
            );
    
            final Button cancel = (Button) dialog.getDialogPane().lookupButton(ButtonType.CANCEL);
            cancel.addEventFilter(ActionEvent.ACTION, event ->
                System.out.println("Cancel was definitely pressed")
            );
    
            Optional<String> result = dialog.showAndWait();
            if (result.isPresent()) {
                System.out.println("Result present => OK was pressed");
                System.out.println("Result: " + result.get());
            } else {
                System.out.println("Result not present => Cancel might have been pressed");
            }    
        }
    
        public static void main(String[] args) {
            Application.launch();
        }
    }
    

    【讨论】:

      【解决方案3】:

      好的,我在这里找到答案JavaFX Dialogs

      如果用户取消对话框,result.isPresent() 将返回 false。

      【讨论】:

        猜你喜欢
        • 2019-01-07
        • 1970-01-01
        • 2021-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多