2012-03-28 45 views
0

我有一个两个表格JTextField s:text1text2检查哪个JTextField将获得焦点

每个文本字段都有一个焦点侦听器,我正在侦听text1和text2上的focusLost()

重点遍历是text1 - > text2

当焦点从text2中丢失时,text1和text2被处理,然后被清除,然后焦点再次被设置为text1。

在文本2,这是我的自定义焦点监听器:

private class Text2FocusListener implements FocusListener{ 
    @Override 
    public void focusLost(FocusEvent arg0){ 
    if(arg0.isTemporary()){ 
     return; 
    } 
    process_input... 
    } 
} 

问题是,如果用户需要点击(通过鼠标或键盘)回到文本1(即需要在文本1场来校正数据),焦点从text2中丢失,并处理来自text1和text2的输入。

if子句中,我需要以某种方式检查焦点是要去text1,我不知道如何。

有人处理过类似的问题吗?

+1

这_if clause_ - 没有看到任何在你的代码段;-)或者换句话说:为更好地帮助更快,显示SSCCE这表明你是什么之后以及你的期望没有得到满足。 – kleopatra 2012-03-28 11:30:06

+0

if(arg0.isTemporary())... – 1ac0 2012-03-29 05:44:25

+0

darn ..对于if是盲目的;-)但仍然没有看到任何SSCCE,我又瞎了? – kleopatra 2012-03-29 09:46:45

回答

2
  1. 对焦/ FocusSubsystem是相当 - 异步,您必须包装rellated代码为invokeLater

  2. FocusListener可能造成的问题的情况下与其他听众一起加入到JTextComponents,例如FocusListenerItemListener加入(编辑)JComboBox造成end_less循环,或与Caret一起DocumentListener太STANGE行为,

  3. 删除这些监听器上focusLost

  4. focusGained所有代码结束之后仅添加需要监听器

  5. 为什么你需要的原因FocusListener,也许有两个更好的选择,但没有从你的问题清楚,编辑你的问题SSCCE

+0

广告1:是的,处理代码在invokeLater()中,但这与问题无关。 – 1ac0 2012-03-28 11:03:52

+0

广告2:只有这一个听众在JTextField上,我知道这个问题,它与问题无关 广告3:效果很好 广告5:没有找到,输入必须在上次输入焦点丢失后验证(“text2”字段) ad 4:hmm,如果我在“text2”字段之后放置仅1像素宽的组件,它将成为焦点遍历上的下一个组件,而不是在text2之后处理“text1”和“text2”失去了重点,如果用户点击回到“text1”项目,处理代码将不会处理。将尝试,看起来不错.. – 1ac0 2012-03-28 11:10:05

+0

这是学术答案,我的学者点,也许有另一种方式,编辑您的问题与SSCCE, – mKorbel 2012-03-28 11:12:01

1

FocusEventpublic Component getOppositeComponent()方法

+1

经过一番阐述,我要回答自己:这是不可能的。事实上,我可以'MyFocusTraversalPolicy扩展可以实现的FocusTraversalPolicy'类,并通过'getComponentAfter()'请求下一个组件,但这与问题“哪个组件将在现实中有焦点无关”。是的,我可以问'MyFocusTraversalPolicy'哪个组件位于组件之前或之前,但是在组件失去焦点之后,没有办法找出真正的哪个组件会获得焦点(我可以通过鼠标点击组件在MyFocusTraversalPolicy中的顺序)。 – 1ac0 2012-04-17 11:50:37