Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 组件未聚焦时防止聚焦事件_Java_Swing_Focus - Fatal编程技术网

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或

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

我发现的解决方法:

连接到JTextArea以及FocusListener。问题是,这意味着,我需要在我的所有组件上附加一个侦听器。这几乎是不可能的。有什么想法吗

你知道如何得到结果吗

Thx LeO

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

尝试组合FocusGaund和focusLost事件


或者告诉我你想完成什么,也许我能帮上忙。

我找到解决方法的方法是检查FocusGoven方法,如果当前组件在自己的JDialog中,而之前的组件是JFrame中的JTextField。如果是这样的话,那么我会记住获得的聚焦分量,将焦点更改为另一个分量,当我收到一个聚焦丢失时,我会请求它返回到之前记忆的分量


某种黑客,但它是有效的。。。。如果有更好的想法,我感兴趣的是…

得失-也许吧。但我的主要问题是,我想要一个显示当前响应的标签。最后一个焦点JTextField(显示属性)。因此,我可以将它设置为“默认单击”=>“own diaolog textfield”,只要获得它就可以了。但我不想再次将其设置为“默认点击”,因为它不再有任何焦点。标签应保留“own dialog textfield”的属性。我的理解是,由于时间问题,失去的焦点和获得的焦点不一定结合在一起。所以,依赖于事件的特定顺序的代码不是我想要的。焦点事件的顺序具有特定的顺序-一个组件失去焦点,然后另一个组件获得焦点。当您激活(点击它,alt+tab从另一个窗口等)窗口(框架,对话框)时,它的一个组件总是获得焦点。如果窗口不是新的,并且以前有焦点,焦点将返回给以前有焦点的组件。标签应保留“own dialog textfield”的属性,但其中的对话框和文本字段也没有焦点…我在一个框架中有一个组件,它显示来自我自己组件的任何类型的属性(=例如JTextArea)(=例如,JTextField)。从用户的角度来看,我希望,一旦我选择了自己的组件(=JTextField)并点击属性区域(=JTextField),我仍然希望拥有最后选择的自写组件(=JTextField)的属性而不是任何先前选择的组件的属性,任何其他地方都是随机聚焦的[?]。好吧,无论如何,我不想讨论太详细。我对设计有自己的想法,并询问是否有人有解决方法的想法。