组件未聚焦时防止FocusEvents

时间:2011-05-20 10:44:23

标签: java swing focus

我有以下示例代码:

import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;

import javax.swing.BoxLayout;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class SampleFocus extends JFrame {

  public SampleFocus(String titel) {
    setTitle(titel);
    JTextField txtField1 = new JTextField("default-click");
    JTextField txtField2 = new JTextField("alternative-Text");
    JTextField txtField3 = new JTextField("own diaolog textfield");

    JTextArea dummyLabel = new JTextArea(10, 20);
    dummyLabel.setText("empty textarea, which is focusable");

    setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
    add(txtField1);
    add(dummyLabel);
    add(txtField2);

    JDialog altDialog = new JDialog(this);
    altDialog.add(txtField3);
    altDialog.setVisible(true);
    altDialog.pack();

    FocusAdapter myFocusListner = new FocusAdapter() {

      @Override
      public void focusGained(FocusEvent e) {
        if (e.getComponent() instanceof JTextField) {
          System.out.println("gained for TextField: "
                             + ((JTextField) e.getComponent()).getText());
        } else {
          System.out.println("gained for component: " + e.getComponent());
        }
      }
    };

    txtField1.addFocusListener(myFocusListner);
    txtField2.addFocusListener(myFocusListner);
    txtField3.addFocusListener(myFocusListner);

    // dummyLabel.addFocusListener(myFocusListner);
  }

  public static void main(String[] args) {
    JFrame frame = new SampleFocus("FocusListener  - sample");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

  }
}

当我从Frame切换到对话框时,我得到了正确的事件。当我切换回Frame时,我也得到了正确的FocusEvents。我的问题是,当我切换回来时,我也得到了我不感兴趣的组件的FocusEvents。

e.g。

选择'默认点击'==>对话框/文本字段==>帧/'空文本区'

结果:我为'默认点击'获得了一个FocusGained-Event,尽管该组件没有焦点。

期望的结果:

  • 组件'default-click'未获得FocusEvent OR

  • 区分该组件是否真正收到了正确的事件(例如我也可以点击它)

解决方法我发现:

附加到JTextArea以及FocusListener。问题是,这意味着,我需要将一个监听器附加到我的组件的ALLLL。这几乎是不可能的。有什么想法吗?

任何想法如何获得结果?

Thx LeO

2 个答案:

答案 0 :(得分:0)

按预期工作。 您选择“默认点击”。它获得了关注。 您选择对话框。框架和“默认点击”失去焦点。 您选择文本区域。现在,事情变得有趣了。对话失去焦点。框架获得焦点。 “默认点击”也会获得焦点,因为他在Frame处于活动状态时拥有它。然后“默认点击”失去焦点,textarea获得焦点(因为你点击了文本区域)。

尝试组合focusGained和focusLost事件。

或者告诉我更多你想要完成的事情,也许我可以提供帮助。

答案 1 :(得分:0)

我找到解决方法的方法是检查focusGained方法,如果当前组件在自己的JDialog中,并且前一个组件是JFrame中的JTextField。如果是这样,那么我会记住获得的聚焦组件,将焦点更改为另一个组件,当我收到一个focusLost时,我会将它请求回到以前记忆的组件。

某种黑客攻击,但它有效......如果有更好的想法,我感兴趣...