如何在Java中激活窗口?

如何在Java中激活窗口?,java,swing,Java,Swing,我想以编程方式激活Swing应用程序。我的意思是,我想编写代码,使JFrame可见并聚焦(窗口标题应突出显示)。 我尝试使用requestFocus()。只有当应用程序至少有两个窗口A和B时,它才能工作:A是隐藏的,B是可见的。现在,如果我调用A.requestFocus(),它将根据我的需要变为活动状态。如果应用程序只有一个窗口或两个窗口都不可见,则不会发生这种情况 我找到了两个解决办法 使用始终位于顶部的假透明未装饰框架。这个假窗口将扮演窗口B的角色。我没有尝试实现它,但它似乎应该工作 调用

我想以编程方式激活Swing应用程序。我的意思是,我想编写代码,使
JFrame
可见并聚焦(窗口标题应突出显示)。 我尝试使用
requestFocus()
。只有当应用程序至少有两个窗口A和B时,它才能工作:A是隐藏的,B是可见的。现在,如果我调用
A.requestFocus()
,它将根据我的需要变为活动状态。如果应用程序只有一个窗口或两个窗口都不可见,则不会发生这种情况

我找到了两个解决办法

  • 使用始终位于顶部的假透明未装饰框架。这个假窗口将扮演窗口B的角色。我没有尝试实现它,但它似乎应该工作
  • 调用A.setAlwaysOnTop(true)。这会使窗口位于其他窗口之上。但它还没有成为焦点。使用
    java.awt.Robot
    (mouseMove、mousePress、mouseerelease)单击窗口a的标题。 现在调用A.setAlwaysOnTop(false),并将鼠标指针返回到以前的位置。 我实现了代码,它可以工作,但它看起来像一个丑陋的解决办法 有“正确”的解决方案吗?

    应该这样做:

    frame.setSelected(true);
    
    您可能希望它位于try/catch块中

    如果这在您使用的操作系统上不起作用,还有两种可能性:

    frame.setAlwaysOnTop(true);
    frame.setAlwaysOnTop(false);
    


    关于你想知道的所有令人痛苦的细节,请参阅本页:

    我和你在同一条船上——以上都不起作用

    “我的”解决方案如下:

    thisFrame.getWindowListeners()[0].windowActivated(
         new WindowEvent(
                  thisFrame,
                  WindowEvent.WINDOW_ACTIVATED
         )
    );
    schedulesTable.requestFocus();
    
    thisFrame = the window to get activated
    
    schedulesTable = my component in the window I wanted to get focus for
    

    我发现了这个问题的解决方法:

    //frame - JFrame
    frame.setExtendedState(JFrame.ICONIFIED);
    frame.setExtendedState(JFrame.NORMAL);
    frame.toFront();
    frame.requestFocus();
    

    在我的配置中(win 7,java 12)-它工作正常且稳定

    ,据我所知,没有
    框架。setSelected
    方法我尝试了这两种方法,但不幸的是,这两种方法都不适用于我。setAlwaysOnTop将窗口置于顶部,但不会使其处于活动状态。这是我已经知道的。toFront()使工具栏上相应的按钮闪烁,但窗口不显示。所以,我用Robot模拟鼠标点击窗口标题的技巧似乎还不错……toFront()很有意义。非常感谢。使用
    requestFocusInWindow
    代替
    requestFocus
    ,请参阅。@Geoffrey-no。。。这是为了聚焦窗口内部的组件,而不是窗口本身。这可能是一个很好的链接,可以让他检查自己是否仍然有问题。谢谢你的更正,不过我认为更常见的做法是关注一个接受用户输入的内部组件,而不是框架本身,因为如果框架的默认组件是可编辑文本,用户可以立即开始键入。谢谢。虽然很多年前我问过这个问题,但现在这个项目已经无关紧要了,我可能会尝试你的解决方案。唯一有效的答案是谢谢!
    thisFrame.getWindowListeners()[0].windowActivated(
         new WindowEvent(
                  thisFrame,
                  WindowEvent.WINDOW_ACTIVATED
         )
    );
    schedulesTable.requestFocus();
    
    thisFrame = the window to get activated
    
    schedulesTable = my component in the window I wanted to get focus for
    
    //frame - JFrame
    frame.setExtendedState(JFrame.ICONIFIED);
    frame.setExtendedState(JFrame.NORMAL);
    frame.toFront();
    frame.requestFocus();