【发布时间】:2011-08-29 13:41:44
【问题描述】:
我有以下示例代码:
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 时,我也得到了正确的 FocusEvents。我的问题是,当我切换回来时,我也会获得我不感兴趣的组件的 FocusEvents。
例如
选择'默认点击' ==> 对话框/文本字段 ==> 框架/'空文本区域'
结果:尽管组件没有焦点,但我得到了“默认点击”的 FocusGained-Event。
期望的结果:要么
组件“默认点击”未获得 FocusEvent 或
判断组件是否真的正确接收到事件(例如,我也可以点击它)
我找到的解决方法:
附加到 JTextArea 以及 FocusListener。问题是,这意味着,我需要在我的所有组件上附加一个 Listener。这几乎是不可能的。有什么想法吗?
任何想法如何得到结果?
谢谢LeO
【问题讨论】: