如何将窗户带到前面?

2022-08-31 11:02:47

我们有一个Java应用程序,当远程控制机制激活应用程序中的某些内容时,需要将其置于前台。

为了得到这个,我们已经在类的被调用方法中实现了,它表示我们应用程序的框架(a的扩展)的以下实现:JFrame

setVisible(true);
toFront();

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

你有什么想法吗?


答案 1

一个可能的解决方案是:

java.awt.EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        myFrame.toFront();
        myFrame.repaint();
    }
});

答案 2

我在Ubuntu(Java 1.6.0_10)下将a带到前面时遇到了同样的问题。我能解决它的唯一方法是提供一个.具体来说,我必须将 my 设置为在调用时始终保持在顶部,并向 .JFrameWindowListenerJFrametoFront()windowDeactivatedsetAlwaysOnTop(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以来,似乎没有必要使用一个 for invoke - 可以看出;此代码已移至方法和 。WindowListenersuper.setAlwaysOnTop(false)toFront()setVisible()

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


推荐