gpt4 book ai didi

java - 当组件未聚焦时阻止 FocusEvents

转载 作者:行者123 更新时间:2023-12-01 05:45:24 25 4
gpt4 key购买 nike

我有以下示例代码:

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);

}
}

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

例如

选择“默认单击”==>对话框/文本字段==>框架/“空文本区域”

结果:尽管组件没有焦点,但我收到“默认单击”的 FocusGained-Event。

期望的结果:要么

  • 组件“default-click”未获取 FocusEvent 或

  • 区分组件是否确实正确接收了事件(例如,我也可以点击进入它)

我发现的解决方法:

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

有什么想法如何获得结果吗?

谢谢LeO

最佳答案

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

尝试结合 focusGained 和 focusLost 事件。

或者告诉我更多你想要实现的目标,也许我可以提供帮助。

关于java - 当组件未聚焦时阻止 FocusEvents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6070764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com