Java 当JDialog中的JTextField可见时,将焦点放在JDialog中的JTextField上
我有一个子类JDialog。。。重写的setVisible方法如下所示:Java 当JDialog中的JTextField可见时,将焦点放在JDialog中的JTextField上,java,swing,focus,jdialog,Java,Swing,Focus,Jdialog,我有一个子类JDialog。。。重写的setVisible方法如下所示: public void setVisible( boolean visible ){ super.setVisible( visible ); if( visible ){ inputJTF.requestFocus(); } } 事实上,当我显示JDialog时,焦点在联合特遣部队上。。。但是后者恰好也是JDialog中的“第一”组件(北面板),所以这并不奇怪 但我的测试代码告
public void setVisible( boolean visible ){
super.setVisible( visible );
if( visible ){
inputJTF.requestFocus();
}
}
事实上,当我显示JDialog时,焦点在联合特遣部队上。。。但是后者恰好也是JDialog中的“第一”组件(北面板),所以这并不奇怪
但我的测试代码告诉我其他事情:
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
app.mainFrame.searchDlg.setVisible( true );
// all 3 of these asserts fail...
assertTrue( app.mainFrame.searchDlg.inputJTF.hasFocus() );
Component focusOwner = app.mainFrame.searchDlg.getFocusOwner();
assertFalse( focusOwner == null );
assertTrue( String.format( "# focus owner %s", focusOwner.getClass()), focusOwner == app.mainFrame.searchDlg.inputJTF );
}
});
。。。所以事实上我被告知“焦点所有者”是空的。。。联合特遣部队也没有重点。有人能解释发生了什么吗?大多数对话框都是模态的,这意味着setVisible(true)语句之后的语句在对话框关闭之前不会执行 默认情况下,焦点将转到对话框上的第一个组件 如果出于某种原因,您需要关注不同的组件,那么请查看一个解决方案,该解决方案允许您控制哪个组件获得关注
此解决方案使用
AncestorListener
在组件显示在可见对话框/框架上时将焦点放在组件上。大多数对话框都是模态的,这意味着直到对话框关闭后才会执行setVisible(true)语句之后的语句
默认情况下,焦点将转到对话框上的第一个组件
如果出于某种原因,您需要关注不同的组件,那么请查看一个解决方案,该解决方案允许您控制哪个组件获得关注
当组件显示在可见对话框/框架上时,此解决方案使用一个
anstorlistener
将焦点放在组件上。Aha。。。这是JUnit和JavaGUI中的一个“问题”
我的代码中的测试失败。。。但以下代码没有:
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
searchDlg.setVisible( true );
assertTrue( searchDlg.queryString == null );
}
});
Robot robot = new Robot();
robot.delay( 10 );
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
// now passes
assertTrue( app.mainFrame.searchDlg.inputJTF.hasFocus() );
}
});
。。。如果robot.delay()
减少为1或不存在,则会发生故障
显然,这与实现JDialog
所需的有限时间有关
Rob Camick的回答很有趣,RequestFocusListener
按预期工作
然而,他的回答实际上并没有回答这个问题:到底发生了什么,为什么这个测试失败了?啊哈。。。这是JUnit和JavaGUI中的一个“问题” 我的代码中的测试失败。。。但以下代码没有:
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
searchDlg.setVisible( true );
assertTrue( searchDlg.queryString == null );
}
});
Robot robot = new Robot();
robot.delay( 10 );
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
// now passes
assertTrue( app.mainFrame.searchDlg.inputJTF.hasFocus() );
}
});
。。。如果robot.delay()
减少为1或不存在,则会发生故障
显然,这与实现JDialog
所需的有限时间有关
Rob Camick的回答很有趣,RequestFocusListener
按预期工作
然而,他的回答实际上并没有回答以下问题:到底发生了什么,为什么测试失败?“setVisible(true)语句之后的语句直到对话框关闭后才会执行”。。。好啊解释了很多,谢谢。您是否知道为什么
getFocusOwner()
会返回null
?现在检查你的对话焦点…如果可以的话。。。我熟悉setVisible(true)阻塞线程(甚至EDT)。。。我花了很多时间对它(新的“事件调度泵”等)挠头。但是,为什么在我的第二个代码段中,它没有阻止EDT线程呢?但是为什么在我的第二个代码段中,
-您试图解决的确切问题是什么?你为什么会在意焦点是什么?仅供参考,您不能总是假定所有代码都是按顺序执行的。与使用invokeAndWait(…)的方式相同,其他代码也可以使用invokeLater(),这意味着在执行断言语句时可能无法确定焦点。张贴正确的SSCCE
,演示问题。代码片段没有帮助,因为我们不了解代码的使用上下文。@MikCorvent,不要忘记单击复选标记“接受”答案,这样人们就知道问题已经解决了。我必须先做一些实验,看看问题是否真的解决了。。。我也在考虑建立一个SSCCE。但是我会在适当的时候将它标记为已解决……”“setVisible(true)语句之后的语句直到对话框关闭后才会执行”。。。好啊解释了很多,谢谢。您是否知道为什么getFocusOwner()
会返回null
?现在检查你的对话焦点…如果可以的话。。。我熟悉setVisible(true)阻塞线程(甚至EDT)。。。我花了很多时间对它(新的“事件调度泵”等)挠头。但是,为什么在我的第二个代码段中,它没有阻止EDT线程呢?但是为什么在我的第二个代码段中,
-您试图解决的确切问题是什么?你为什么会在意焦点是什么?仅供参考,您不能总是假定所有代码都是按顺序执行的。与使用invokeAndWait(…)的方式相同,其他代码也可以使用invokeLater(),这意味着在执行断言语句时可能无法确定焦点。张贴正确的SSCCE
,演示问题。代码片段没有帮助,因为我们不了解代码的使用上下文。@MikCorvent,不要忘记单击复选标记“接受”答案,这样人们就知道问题已经解决了。我必须先做一些实验,看看问题是否真的解决了。。。我也在考虑建立一个SSCCE。但我会在适当的时候将它标记为已解决。。。