我有以下示例代码:
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
答案 0 :(得分:0)
按预期工作。 您选择“默认点击”。它获得了关注。 您选择对话框。框架和“默认点击”失去焦点。 您选择文本区域。现在,事情变得有趣了。对话失去焦点。框架获得焦点。 “默认点击”也会获得焦点,因为他在Frame处于活动状态时拥有它。然后“默认点击”失去焦点,textarea获得焦点(因为你点击了文本区域)。
尝试组合focusGained和focusLost事件。
或者告诉我更多你想要完成的事情,也许我可以提供帮助。
答案 1 :(得分:0)
我找到解决方法的方法是检查focusGained方法,如果当前组件在自己的JDialog中,并且前一个组件是JFrame中的JTextField。如果是这样,那么我会记住获得的聚焦组件,将焦点更改为另一个组件,当我收到一个focusLost时,我会将它请求回到以前记忆的组件。
某种黑客攻击,但它有效......如果有更好的想法,我感兴趣...