gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:28:15 25 4
gpt4 key购买 nike

这里的上下文是单元测试:在测试结束时,在 tearDown 处,如果 JFileChooser 保持“挂起”(即显示),我想要强制它返回“已取消”值。

问题是,否则,我调用 showOpenDialog (阻塞方法)的 actionPerformed() 会继续存在...我需要关闭沿着Runnable

注意,运行 actionPerformedRunnable 当然是在 EDT 中运行。但尽管如此,该框架仍然能够启动另一个“事件泵”:我的理解是,当您在 EDT 中执行 JFileChooser.showOpenDialog 时,这是非常正常且正确的行为:与调用一个类似的功能EDT 中的 JOptionPane.showXXX 静态方法。

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

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

PPS (稍后) 我设计了一种我认为相当“不稳定”的方法:这涉及深入研究 JFileChooser使用 getText() == "Cancel"标识 JButton。抱歉,它是用 Jython 编写的,但即使对于那些不懂 Python 的人来说,它也应该很容易掌握:

def close_main_frame():
self.main_frame.dispose()
self.cancel_button = None
def explore_descendant_comps( container, method, breadth_first = False, depth = 0 ):
for component in container.components:
if isinstance( component, java.awt.Container ):
if breadth_first:
method( component, depth )
explore_descendant_comps( component, method, breadth_first, depth + 1 )
if not breadth_first:
method( component, depth )
def identify_cancel_button( comp, depth ):
if isinstance( comp, javax.swing.JButton ) and comp.text == 'Cancel':
self.cancel_button = comp
explore_descendant_comps( self.main_frame.analysis_file_chooser, identify_cancel_button )
if self.cancel_button:
self.cancel_button.doClick()
else:
raise Exception()

self.edt_despatcher.run_in_edt( close_main_frame, False )

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

最佳答案

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()

(或)

如果您的 Jython 中有组件,请通过对组件进行检查来调用 component.cancelSelection()。

关于java - 有没有办法以编程方式从 JFileChooser.showOpenDialog() 返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35245120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com