如何将窗口带到前面?

新手上路,请多包涵

我们有一个 Java 应用程序,当远程控制机制激活应用程序中的某些内容时,它需要被带到前台。

为了做到这一点,我们在表示我们应用程序框架的类的 JFrame 方法中实现了以下实现:

 setVisible(true);
toFront();

在 Windows XP 下,这在第一次调用时有效,第二次只有任务栏中的选项卡闪烁,框架不再出现在前面。 Win2k 也是如此。在 Vista 上它似乎工作正常。

你有什么想法?

原文由 boutta 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 462
2 个回答

我在将 JFrame 带到 Ubuntu(Java 1.6.0_10)下的前面时遇到了同样的问题。我可以解决它的唯一方法是提供 WindowListener 。 Specifically, I had to set my JFrame to always stay on top whenever toFront() is invoked, and provide windowDeactivated event handler to setAlwaysOnTop(false) .


因此,这里的代码可以放入一个基础 JFrame 中,用于派生所有应用程序框架。

 @Override
public void setVisible(final boolean visible) {
  // make sure that frame is marked as not disposed if it is asked to be visible
  if (visible) {
      setDisposed(false);
  }
  // let's handle visibility...
  if (!visible || !isVisible()) { // have to check this condition simply because super.setVisible(true) invokes toFront if frame was already visible
      super.setVisible(visible);
  }
  // ...and bring frame to the front.. in a strange and weird way
  if (visible) {
      toFront();
  }
}

@Override
public void toFront() {
  super.setVisible(true);
  int state = super.getExtendedState();
  state &= ~JFrame.ICONIFIED;
  super.setExtendedState(state);
  super.setAlwaysOnTop(true);
  super.toFront();
  super.requestFocus();
  super.setAlwaysOnTop(false);
}

每当您的框架应该显示或带到前面调用 frame.setVisible(true)

自从我搬到 Ubuntu 9.04 以来,似乎没有必要使用 WindowListener 来调用 super.setAlwaysOnTop(false) 可以观察到;此代码已移至方法 toFront()setVisible()

请注意方法 setVisible() 应始终在 EDT 上调用。

原文由 01es 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题