我有 JDialog 的子类...重写的 setVisible 方法如下所示:
public void setVisible( boolean visible ){
super.setVisible( visible );
if( visible ){
inputJTF.requestFocus();
}
}
事实上,当我显示 JDialog 时,焦点位于 JTF 上...但后者恰好也是 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) 语句之后的语句只有在对话框关闭后才会执行。
默认情况下,焦点将转到对话框上的第一个组件。
如果由于某种原因您需要关注不同的组件,请查看 Dialog Focus获取允许您控制哪个组件获得焦点的解决方案。
此解决方案使用 AncestorListener
在组件显示在可见对话框/框架上时将焦点置于组件上。
关于java - 当 JDialog 中的 JTextField 可见时,将焦点放在 JTextField 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37057002/