Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试时如何自动单击JOptionPane上的OK?_Java_Swing_Testing_Popup_Joptionpane - Fatal编程技术网

Java 测试时如何自动单击JOptionPane上的OK?

Java 测试时如何自动单击JOptionPane上的OK?,java,swing,testing,popup,joptionpane,Java,Swing,Testing,Popup,Joptionpane,在我的程序中,我正在测试一个按钮,单击该按钮会在应用程序中弹出一个JOptionPane窗口 但是,当该窗口弹出时,它希望用户单击OK,这意味着除非手动关闭该窗口,否则测试无法继续 我希望能够在该窗口出现在我的测试中时以编程方式关闭该窗口,或者阻止这些JopOptions窗格窗口在此测试中弹出。首先,从JopOptions窗格对象创建JDialog。然后,创建一个计时器以在您想要的时间内运行(例如1分钟),并在对话框完成后处理对话框。然后,从JOptionPane对象中检索所选的值,确保在计时器

在我的程序中,我正在测试一个按钮,单击该按钮会在应用程序中弹出一个JOptionPane窗口

但是,当该窗口弹出时,它希望用户单击OK,这意味着除非手动关闭该窗口,否则测试无法继续


我希望能够在该窗口出现在我的测试中时以编程方式关闭该窗口,或者阻止这些JopOptions窗格窗口在此测试中弹出。

首先,从
JopOptions窗格
对象创建
JDialog
。然后,创建一个
计时器
以在您想要的时间内运行(例如1分钟),并在对话框完成后处理
对话框。然后,从
JOptionPane
对象中检索所选的值,确保在计时器释放对话框时考虑未初始化的值

    final JOptionPane pane = new JOptionPane(......., JOptionPane.OK_CANCEL_OPTION);
    final JDialog dialog = pane.createDialog(.....);
    Timer timer = new Timer(you_time, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            dialog.dispose();
        }

    });
    timer.start();
    dialog.setVisible(true);
    dialog.dispose();
    Integer choice = (Integer) (pane.getValue() == JOptionPane.UNINITIALIZED_VALUE ? JOptionPane.OK_OPTION : pane.getValue());

首先,从
JOptionPane
对象创建
JDialog
。然后,创建一个
计时器
以在您想要的时间内运行(例如1分钟),并在对话框完成后处理
对话框。然后,从
JOptionPane
对象中检索所选的值,确保在计时器释放对话框时考虑未初始化的值

    final JOptionPane pane = new JOptionPane(......., JOptionPane.OK_CANCEL_OPTION);
    final JDialog dialog = pane.createDialog(.....);
    Timer timer = new Timer(you_time, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            dialog.dispose();
        }

    });
    timer.start();
    dialog.setVisible(true);
    dialog.dispose();
    Integer choice = (Integer) (pane.getValue() == JOptionPane.UNINITIALIZED_VALUE ? JOptionPane.OK_OPTION : pane.getValue());

解决这个问题有两种基本方法。两者都要求您能够找到按钮

这需要能够使用第二个
线程
查找窗口/对话框,并遍历其容器以查找按钮

根据您的测试设置方式,将取决于您可能需要完成的额外工作。UI应该在事件调度线程内运行,如果测试在同一线程中运行,则需要使用单独的
线程
,因为
作业窗格
将阻止EDT(以特殊方式),使代码无法运行,直到选项窗格关闭

如果您的测试已经在一个单独的
线程中运行,那么您就有了更多的功能

这是一个非常简单的例子。它在EDT的上下文中初始化一个
JOptionPane
,但有一些方法正在主线程中运行,这些方法查找并执行消息对话框的“OK”按钮

import java.awt.Button;
import java.awt.Component;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Window;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class FindButton {

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JOptionPane.showMessageDialog(null, "This is message dialog", "Message", JOptionPane.INFORMATION_MESSAGE);
            }
        });

        JDialog frame = waitForDialog("Message");
        System.out.println("Found window " + frame);
        if (frame != null) {
            final JButton btn = getButton(frame, "OK");
            System.out.println("Found button " + btn);
            if (btn != null) {
                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        btn.doClick();
                    }
                });
            }
        }
    }

    public static JDialog waitForDialog(String title) {

        JDialog win = null;
        do {
            for (Window window : Frame.getWindows()) {
                if (window instanceof JDialog) {
                    JDialog dialog = (JDialog) window;
                    System.out.println(dialog.getTitle());
                    if (title.equals(dialog.getTitle())) {
                        win = dialog;
                        break;
                    }
                }
            }

            if (win == null) {
                try {
                    Thread.sleep(250);
                } catch (InterruptedException ex) {
                    break;
                }
            }

        } while (win == null);

        return win;

    }

    public static JButton getButton(Container container, String text) {
        JButton btn = null;
        List<Container> children = new ArrayList<Container>(25);
        for (Component child : container.getComponents()) {
            System.out.println(child);
            if (child instanceof JButton) {
                JButton button = (JButton) child;
                if (text.equals(button.getText())) {
                    btn = button;
                    break;
                }
            } else if (child instanceof Container) {
                children.add((Container) child);
            }
        }
        if (btn == null) {
            for (Container cont : children) {
                JButton button = getButton(cont, text);
                if (button != null) {
                    btn = button;
                    break;
                }
            }
        }
        return btn;
    }

}
import java.awt.Button;
导入java.awt.Component;
导入java.awt.Container;
导入java.awt.EventQueue;
导入java.awt.Frame;
导入java.awt.Window;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JButton;
导入javax.swing.JDialog;
导入javax.swing.JOptionPane;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类FindButton{
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
showMessageDialog(null,“这是消息对话框”,“消息”,JOptionPane.INFORMATION\u消息);
}
});
JDialog frame=waitForDialog(“消息”);
System.out.println(“找到的窗口”+框架);
如果(帧!=null){
最终JButton btn=getButton(帧“OK”);
系统输出打印项次(“找到按钮”+btn);
如果(btn!=null){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
btn.doClick();
}
});
}
}
}
公共静态JDialog waitForDialog(字符串标题){
JDialog win=null;
做{
对于(窗口:Frame.getWindows()){
if(JDialog的窗口实例){
JDialog对话框=(JDialog)窗口;
System.out.println(dialog.getTitle());
if(title.equals(dialog.getTitle())){
win=对话;
打破
}
}
}
if(win==null){
试一试{
睡眠(250);
}捕获(中断异常例外){
打破
}
}
}while(win==null);
回归胜利;
}
公共静态JButton getButton(容器容器,字符串文本){
JButton btn=null;
列表子项=新数组列表(25);
对于(组件子级:container.getComponents()){
系统输出打印项次(子项);
if(JButton的子实例){
JButton按钮=(JButton)子按钮;
if(text.equals(button.getText())){
btn=按钮;
打破
}
}else if(容器的子实例){
添加((容器)子对象);
}
}
如果(btn==null){
适用于(容器内容:儿童){
JButton button=getButton(cont,text);
如果(按钮!=null){
btn=按钮;
打破
}
}
}
返回btn;
}
}
本例使用
JButton
doClick
方法模拟单击按钮。您可以使用按钮中的
locationOnScreen
信息和
java.awt.Robot
来实际单击按钮。但这似乎更简单


您还可以看看哪一个实用程序库设计用于更容易地测试基于Swing(和JavaFX)的应用程序…

有两种基本方法可以解决此问题。都是r
public class ActionWithUI extends AbstractAction{

  @Override
  public void actionPerformed( ActionEvent e ){
    //... do some stuff
   int result = askUserForInput();
   //do some other stuff based on the result of the JOptionPane
  }

  int askUserForInput(){
    return JOptionPane.show...
  }
}