Java - 显示最小化的JFrame窗口

7
如果一个JFrame窗口被最小化了,有没有办法使其重新获得焦点?
我正在尝试让它点击某个位置,然后将其恢复。
            while (isRunning) {
                start = System.currentTimeMillis();
                frame.setState(Frame.ICONIFIED);
                robot.mouseMove(clickX, clickY);
                robot.mousePress(InputEvent.BUTTON1_MASK);
                frame.setState(Frame.NORMAL);
                Thread.sleep(clickMs - (System.currentTimeMillis() - start));
            }

我无法理解你试图做什么。 - Pritom
抱歉,我之前表达不够清晰。我有一个在任务栏上被最小化的JFrame窗口,我想要将它显示出来(就像当你点击任务栏上的最小化窗口时,它会弹出来一样)。 - Stripies
@JonMannerberg 这被称为“图标化”和“取消图标化”。 - Jon Egeland
1
  1. 在GUI中调用Thread.sleep(n)是危险的。应该设置一个基于Swing的一次性触发的Timer
  2. 为了更快地获得更好的帮助,请发布一个SSCCE
- Andrew Thompson
Stripies,你解决了你的问题吗?我似乎遇到了非常相似的问题。 - Alexander K
显示剩余4条评论
2个回答

16

如果您想将其从“最小化”状态还原,只需将其状态设置为normal

JFrame frame = new JFrame(...);
// Show the frame
frame.setVisible(true);

// Sleep for 5 seconds, then minimize
Thread.sleep(5000);
frame.setState(java.awt.Frame.ICONIFIED);

// Sleep for 5 seconds, then restore
Thread.sleep(5000);
frame.setState(java.awt.Frame.NORMAL);

来自这里的示例。

还有一些WindowEvent被触发,每当状态改变时,并且一个WindowListener接口处理这些触发。在这种情况下,您可以使用:

public class YourClass implements WindowListener {
  ...
  public void windowDeiconified(WindowEvent e) {
    // Do something when the window is restored
  }
}

如果您想检查另一个程序的状态更改,那么就没有“纯Java”解决方案,但只需要获取窗口的 ID


1
我只是为了测试尝试了一下,结果可以。但是当我将其实现到我的实际程序中时,它就不起作用了。 - Stripies
如果您在问题中发布代码,我们可以修改它使其正常工作。 - Jon Egeland

7
您可以将状态设置为正常:
frame.setState(NORMAL);

完整示例:

public class FrameTest extends JFrame {

    public FrameTest() {
        final JFrame miniFrame = new JFrame();
        final JButton miniButton = new JButton(
          new AbstractAction("Minimize me") {
            public void actionPerformed(ActionEvent e) {
                miniFrame.setState(ICONIFIED);
            }
        }); 

        miniFrame.add(miniButton);
        miniFrame.pack();
        miniFrame.setVisible(true);

        add(new JButton(new AbstractAction("Open") {
            public void actionPerformed(ActionEvent e) {
                miniFrame.setState(NORMAL);
                miniFrame.toFront();
                miniButton.requestFocusInWindow();
            }
        }));

        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new FrameTest();
    }

}

@AndrewThompson:好的建议,我已经加上了它们和一个最小化按钮。 - Jonas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接