Java 组件未聚焦时防止聚焦事件
我有以下示例代码:Java 组件未聚焦时防止聚焦事件,java,swing,focus,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.Wind
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);
}
}
当我从框架切换到对话框时,我得到了正确的事件。当我切换回画面时,我也得到了正确的焦距。我的问题是,当我切换回来时,我也会得到我不感兴趣的组件的焦点事件
e、 g
选择“默认单击”==>Dialog/Textfield==>Frame/“空文本区域”
结果:虽然组件没有焦点,但我得到了“默认单击”的FocusGoven事件
期望的结果:要么
- 组件“默认单击”未获取FocusEvent或
- 区分组件是否正确地接收到事件(例如,我也可以点击它)
或者告诉我你想完成什么,也许我能帮上忙。我找到解决方法的方法是检查FocusGoven方法,如果当前组件在自己的JDialog中,而之前的组件是JFrame中的JTextField。如果是这样的话,那么我会记住获得的聚焦分量,将焦点更改为另一个分量,当我收到一个聚焦丢失时,我会请求它返回到之前记忆的分量
某种黑客,但它是有效的。。。。如果有更好的想法,我感兴趣的是…得失-也许吧。但我的主要问题是,我想要一个显示当前响应的标签。最后一个焦点JTextField(显示属性)。因此,我可以将它设置为“默认单击”=>“own diaolog textfield”,只要获得它就可以了。但我不想再次将其设置为“默认点击”,因为它不再有任何焦点。标签应保留“own dialog textfield”的属性。我的理解是,由于时间问题,失去的焦点和获得的焦点不一定结合在一起。所以,依赖于事件的特定顺序的代码不是我想要的。焦点事件的顺序具有特定的顺序-一个组件失去焦点,然后另一个组件获得焦点。当您激活(点击它,alt+tab从另一个窗口等)窗口(框架,对话框)时,它的一个组件总是获得焦点。如果窗口不是新的,并且以前有焦点,焦点将返回给以前有焦点的组件。标签应保留“own dialog textfield”的属性,但其中的对话框和文本字段也没有焦点…我在一个框架中有一个组件,它显示来自我自己组件的任何类型的属性(=例如JTextArea)(=例如,JTextField)。从用户的角度来看,我希望,一旦我选择了自己的组件(=JTextField)并点击属性区域(=JTextField),我仍然希望拥有最后选择的自写组件(=JTextField)的属性而不是任何先前选择的组件的属性,任何其他地方都是随机聚焦的[?]。好吧,无论如何,我不想讨论太详细。我对设计有自己的想法,并询问是否有人有解决方法的想法。