Java 在应用程序中保持焦点,即使它有子窗口

Java 在应用程序中保持焦点,即使它有子窗口,java,swing,focus,focuslistener,Java,Swing,Focus,Focuslistener,我需要实现一个例程,确保应用程序永远不会失去对其他应用程序的关注(但是当它最小化时,我不应该强制它返回)。因此我决定在主窗口中实现WindowFocusListener: public class DialogoPrincipal extends JFrame implements WindowFocusListener { public DialogoPrincipal() { initComponents(); this.addWindowFocus

我需要实现一个例程,确保应用程序永远不会失去对其他应用程序的关注(但是当它最小化时,我不应该强制它返回)。因此我决定在主窗口中实现WindowFocusListener:

public class DialogoPrincipal extends JFrame implements WindowFocusListener {

    public DialogoPrincipal() {
        initComponents();
        this.addWindowFocusListener(this);
    }

    @Override
    public void windowGainedFocus(WindowEvent e) {
        //Do nothing
    }

    @Override
    public void windowLostFocus(WindowEvent e) {
        this.toFront();
    }

    /*hidden code*/
}
当主窗口不显示任何子窗口时,它工作得非常好。但是当一些子窗口打开时,我无法强制应用程序聚焦。 即使应用程序有子窗口,或者我需要在所有对话框中实现WindowFocusListener,是否有办法在应用程序中强制设置焦点? 如果我需要实现这个接口,我可以为JOptionPane.showMessageDialog(…)做些什么?不要失去对它的关注?

  • 由于无法正确维护,dirty hack必须将
    JFrames
    添加到
    two\u Dimensional array
    ,该数组提供
    FocusAnswery
    ,并且具有
    正确的顺序

  • focuswhich
    是简单的
    asynchronous
    ,因为它基于来自
    本机操作系统的属性,必须延迟
    focuswhich
    内部的
    调用器

  • 的逻辑可用于适当的容器层次结构
    JFrame
    &
    JDialog

  • 使用,然后可以将
    焦点
    返回到
    父级

      • 由于无法正确维护,dirty hack必须将
        JFrames
        添加到
        two\u Dimensional array
        ,该数组提供
        FocusAnswery
        ,并且具有
        正确的顺序

      • focuswhich
        是简单的
        asynchronous
        ,因为它基于来自
        本机操作系统的属性,必须延迟
        focuswhich
        内部的
        调用器

      • 的逻辑可用于适当的容器层次结构
        JFrame
        &
        JDialog

      • 使用,然后可以将
        焦点
        返回到
        父级


      我通过实现一个由所有子窗口继承的抽象类解决了这个问题:

      public abstract class DialogoFocado extends JDialog implements WindowFocusListener {
      
          public DialogoFocado(Frame owner) {
              super(owner);
              this.addWindowFocusListener(this);
          }
      
          @Override
          public void windowGainedFocus(WindowEvent e) {
          }
      
          @Override
          public void windowLostFocus(WindowEvent e) {
              this.toFront();
          }
      }
      

      我解决了这个问题,实现了一个由所有子窗口继承的抽象类:

      public abstract class DialogoFocado extends JDialog implements WindowFocusListener {
      
          public DialogoFocado(Frame owner) {
              super(owner);
              this.addWindowFocusListener(this);
          }
      
          @Override
          public void windowGainedFocus(WindowEvent e) {
          }
      
          @Override
          public void windowLostFocus(WindowEvent e) {
              this.toFront();
          }
      }
      

      为了更好地帮助您更快地发布一个,大约
      JFrame
      ,两个
      JDialogs
      ,使用
      JButton
      调用
      JOptionPane
      ,您可以在每个子窗口上调用
      setFocusableWindowState(false)
      。为了更好地帮助您更快发布一个,大约
      JFrame
      ,两个
      JDialogs
      通过
      JButton
      调用
      JOptionPane
      ,您可以在每个子窗口上调用
      setFocusableWindowState(false)