有没有办法以编程方式从JFileChooser.showOpenDialog()返回?

时间:2016-02-06 18:57:23

标签: java multithreading unit-testing jython jfilechooser

上下文是单元测试:在测试结束时,在tearDown,如果JFileChooser被“悬挂”(即显示),我想强制它返回“已取消”值。

问题是,否则,actionPerformed()我称之为showOpenDialog(阻止方法)仍在继续......我需要关闭Runnable

注意Runnable正在运行actionPerformed当然是在EDT中运行的。但尽管如此,该框架能够启动另一个“事件泵”:我的理解是,当您在EDT中执行JFileChooser.showOpenDialog时,这是非常正常和正确的行为:类似于调用其中一个{{1} EDT中的静态方法。

我还想避免一个“测试设计”的解决方案:换句话说,应用程序代码必须足够自己,并且不要使用曲折或不自然的机制知道它将通过测试运行需要提供“句柄”的代码。

PS我实际上使用的是Jython而不是Java,我使用的是Python JOptionPane.showXXX模块,而不是基于Java的单元测试框架。但这并没有改变所涉及的原则......

PPS (稍后) 我设计了一种方法,我认为这种方法相当“不稳定”:这需要深入研究unittest以确定{ {1}} JFileChooser ==“取消”。对不起,它是用Jython编写的,但即使对那些不懂Python的人也应该很容易理解:

JButton

这是“不稳定的”,尤其是因为按钮的“取消”文本可能会被另一种语言的其他名称替换...

1 个答案:

答案 0 :(得分:1)

JFileChooser chooser = new JFileChooser();
chooser.addActionListener( new ActionListener() 
{
    public void actionPerformed(ActionEvent e) 
    {
       if( e.getActionCommand().equals("CancelSelection") )
       {
            chooser.cancelSelection();
       }
    }
} );

public void forceCancel()
{
   ActionEvent e = new ActionEvent(chooser, ActionEvent.ACTION_PERFORMED, "CancelSelection");
   fireActionPerformed(e);
}

public void fireActionPerformed( ActionEvent e )
{
   ActionListener[] listeners = chooser.getActionListeners();
  for( ActionListener listener : listeners )
  {
     listener.actionPerformed( e );
  }
}

使用此代码,您可以调用forceCancel()来触发操作事件以自动取消JFileChooser。您可以在单元测试中加入forceCancel()

(OR)

如果你的Jython调用component.cancelSelection()中的组件是通过make对组件进行检查的实例。