当前位置: 首页 > 知识库问答 >
问题:

JavaFX:以编程方式关闭报警框(或任何对话框)

易风华
2023-03-14
alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Title");
alert.setHeaderText("Some Text");
alert.setContentText("Choose your option.");
buttonTypeOne = new ButtonType("Yes");
buttonTypeCancel = new ButtonType("No", ButtonData.CANCEL_CLOSE);
alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeCancel);
Optional<ButtonType> result = alert.showAndWait();

编辑:包括示例代码-

>

  • mainapp.Java-负责处理应用程序的Java类
  • controller.java-相应的控制器文件
  • design.FXML-通过mainapp.java加载并由controller.java控制的应用程序的FXML文件
  • compute.java-执行计算的另一个java类。

    公共类Compute{Alert Alert;

    public void function1{
      Platform.runLater(new Runnable(){
          public void run(){
          alert = new Alert(AlertType.CONFIRMATION);
          alert.setTitle("Title");
          alert.setHeaderText("Some Text");
          alert.setContentText("Choose your option.");
          buttonTypeOne = new ButtonType("Yes");
          buttonTypeCancel = new ButtonType("No", ButtonData.CANCEL_CLOSE);
          alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeCancel);
    
          Optional<ButtonType> result = alert.showAndWait();
          if (result.get() == buttonTypeOne){
          // ... user chose "One"
          } else {
          // ... user chose CANCEL or closed the dialog
          }
    
          }
      });
    }
    
    public void function2{
     //......Does some long computation here 
     //.... If the computation finishes before the user chooses 'Yes' or 'No' on alert box
    //...Then close the alertbox here and execute the code corresponding to buttonTypeCancel
    
    
    //..I tried alert.close(); and alert.hide(); but doesn't work.
    }
    

    }

    还有,有没有其他的解决方案可以做到这一点呢?最初,我想让compute.java中的任何javafx代码保持干净,但不知道如何保持干净。

  • 共有1个答案

    商飞龙
    2023-03-14

    试试这个

    public void function2 {
        Button cancelButton = ( Button ) alert.getDialogPane().lookupButton( buttonTypeCancel );
        cancelButton.fire();
    }
    

    或更一般的

    public void function2 {
        for ( ButtonType bt : alert.getDialogPane().getButtonTypes() )
        {
            if ( bt.getButtonData() == ButtonBar.ButtonData.CANCEL_CLOSE )
            {
                Button cancelButton = ( Button ) alert.getDialogPane().lookupButton( bt );
                cancelButton.fire();
                break;
            }
        }
    }
    

    完整示例:

    @Override
    public void start( final Stage primaryStage )
    {
        Alert alert = new Alert( Alert.AlertType.CONFIRMATION );
        alert.setTitle( "Title" );
        alert.setHeaderText( "Some Text" );
        alert.setContentText( "Choose your option." );
        ButtonType buttonTypeOne = new ButtonType( "Yes" );
        alert.initModality( Modality.NONE );
        ButtonType buttonTypeCancel = new ButtonType( "No", ButtonBar.ButtonData.CANCEL_CLOSE );
        alert.getButtonTypes().setAll( buttonTypeOne, buttonTypeCancel );
    
        Button b = new Button( "close alert" );
        b.setOnAction(( ActionEvent event ) ->
        {
            for ( ButtonType bt : alert.getDialogPane().getButtonTypes() )
            {
                System.out.println( "bt = " + bt );
                if ( bt.getButtonData() == ButtonBar.ButtonData.CANCEL_CLOSE )
                {
                    Button cancelButton = ( Button ) alert.getDialogPane().lookupButton( bt );
                    cancelButton.fire();
                    break;
                }
            }
        });
    
        final Scene scene = new Scene( new Group( b ), 400, 300 );
        primaryStage.setScene( scene );
        primaryStage.show();
    
        Optional<ButtonType> result = alert.showAndWait();
        if ( result.get() == buttonTypeOne )
        {
            System.out.println( "one " );
        }
        else if( result.get() == buttonTypeCancel )
        {
            System.out.println( "cancel " );
        }
    }
    
     类似资料:
    • 问题内容: 我对joptionpane有疑问。 使用JOptionPane.showMessageDialog(…),我们可以创建一个消息对话框。但是如何以编程方式将其关闭? 问题答案: 您总是可以通过获取其持有的任何组件的WindowAncestor来获得对JOptionPane的引用,然后调用或返回Window。该窗口可以通过使用获得 例如:

    • 我正在使用新的JavaFX Alert类(Java1.8_40),并尝试在exibition文本中使用HTML标记,但到目前为止还没有成功。下面是我正在尝试做的一个例子。 有没有人知道这是不是真的可能,给我举个例子? 提前道谢。

    • 问题内容: 我希望能够在一定时间后或在特定事件(例如)后使用Javascript自动关闭警报框。从我的研究来看,内置函数似乎不可能实现。有没有办法覆盖它并控制它打开的对话框? 另外,我不希望显示隐藏的div作为警报的替代。我需要一个实际的对话框。 问题答案: 如前所述,您确实无法做到这一点。您可以使用UI框架在窗口内进行模式对话框,也可以具有弹出窗口,该脚本具有超时后自动关闭的脚本…每个方面都有负

    • 我有一个上下文菜单,它包含一个带有一些控件的CustomMenuItem。单击按钮时,会自动显示对话框和隐藏上下文菜单。问题是:我想在对话框显示时阻止关闭上下文菜单。我该如何解决这个问题呢? 我已经追踪到这件事了。当对话框打开时,将触发一个FocusUngrabEvent.Focus_Ungrab事件,该事件在PopupWindow中处理。我已经尝试在FocusUngrabEvent.Focus_

    • 我正在使用netty 4.0。24.4决赛。 我需要以编程方式启动/停止网络服务器。 在启动服务器时,线程在 请提供一些如何正确操作的提示。下面是由主类调用的EchoServer。谢谢 更新:我用以下方式更改了EchoServer类。其想法是在新线程中启动服务器,并保留到EventLoopGroup的链接。这条路对吗?

    • 我想以编程方式取消系统生成的报警对话框。我已经尝试了这里提供的所有解决方案(stackoverflow)但似乎都不起作用。这是普遍接受的答案,但它只排除了通知面板和最近的任务菜单。 我已经在操作系统版本4.0.3、4.2.2、4.4.2和5.1.1的设备上测试了它,它在所有这些设备上都具有相同的行为。有一些应用程序实际上可以取消所有的系统对话框(Mubble)。有人能建议一下是怎么做的吗? 谢谢