JWindow 总是在最前面
JWindow always on top
我使用了 Java 和 Swing。
我有两个 windows MainWindow
和 PointWindow
。
MainWindow
是一个 JFrame window.
PointWindow
扩展 JWindow
。
我想让 PointWindow
始终位于顶部(绝不在其他 windows 或组件下方)。我在 PointWindow
的构造函数中设置了 setAlwaysOnTop(true)
但问题是当我单击 MainWindow
(焦点)时,接下来以不同的方式单击我的桌面(空 space ) 并尝试拖动 PointWindow
然后它在我的 MainWindow
.
下
有什么方法可以让 PointWindow
始终位于所有组件之上?
编辑
在构造函数中我尝试使用 WindowListener
如下
this.addWindowListener(new WindowAdapter() {
@Override
public void windowDeactivated(WindowEvent e) {
toFront();
}
@Override
public void windowLostFocus(WindowEvent e) {
toFront();
}
});
...但它不起作用,事件未被捕获
如果两个 windows 属于同一个应用程序,则
setAlwaysOnTop(true);
方法应有尽有,随心所欲
如果您的 window 必须保持在顶部,即使您的应用程序失去焦点,您也必须定期将其推回顶部。如果另一个 window 获得焦点,您无法控制它,但您可以使用线程将您的 window 推回顶部。
在下面的示例中,fr 是您的 window
Thread th = new Thread(){
public void run(){
boolean live = true;
while(live){
try{
fr.toFront();
fr.setAlwaysOnTop(true);
}catch(Exception e1){
e1.printStackTrace();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
此代码将每 100 毫秒将您的 window 推回到前面,对于大多数应用程序来说应该足够了。这不是最好的解决方案,但应该可行
编辑:
如果你只是想让 window 在你的另一个 window 前面(重获焦点后的事件),你可以添加和
a FocusListener 到你的 JFrame 并在你的 window 上调用 toFront,当 focusGained(FocusEvent e) 事件触发时。
或您可以创建以框架为父级的 JWindow:
新的 JWindow(jframeParent);
这样,您的 JWindow 将收到所有事件。
或 只是使用未修饰的 JFrame 而不是 JWindow
EDIT2:
如果您只是想让 window 位于顶部,当您单击它时,MouseListener 是正确的方法。
解决方案
我将 MouseAdapter
作为 MouseListener
添加到 PointWindow
并且当检测到 mousePressed
事件时执行 toFront()
并且工作正常但是有一个side effect,表示有一个瞬间window是hide and show(非常快)。
我使用了 Java 和 Swing。
我有两个 windows MainWindow
和 PointWindow
。
MainWindow
是一个 JFrame window.
PointWindow
扩展 JWindow
。
我想让 PointWindow
始终位于顶部(绝不在其他 windows 或组件下方)。我在 PointWindow
的构造函数中设置了 setAlwaysOnTop(true)
但问题是当我单击 MainWindow
(焦点)时,接下来以不同的方式单击我的桌面(空 space ) 并尝试拖动 PointWindow
然后它在我的 MainWindow
.
有什么方法可以让 PointWindow
始终位于所有组件之上?
编辑
在构造函数中我尝试使用 WindowListener
如下
this.addWindowListener(new WindowAdapter() {
@Override
public void windowDeactivated(WindowEvent e) {
toFront();
}
@Override
public void windowLostFocus(WindowEvent e) {
toFront();
}
});
...但它不起作用,事件未被捕获
如果两个 windows 属于同一个应用程序,则
setAlwaysOnTop(true);
方法应有尽有,随心所欲
如果您的 window 必须保持在顶部,即使您的应用程序失去焦点,您也必须定期将其推回顶部。如果另一个 window 获得焦点,您无法控制它,但您可以使用线程将您的 window 推回顶部。
在下面的示例中,fr 是您的 window
Thread th = new Thread(){
public void run(){
boolean live = true;
while(live){
try{
fr.toFront();
fr.setAlwaysOnTop(true);
}catch(Exception e1){
e1.printStackTrace();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
此代码将每 100 毫秒将您的 window 推回到前面,对于大多数应用程序来说应该足够了。这不是最好的解决方案,但应该可行
编辑:
如果你只是想让 window 在你的另一个 window 前面(重获焦点后的事件),你可以添加和
a FocusListener 到你的 JFrame 并在你的 window 上调用 toFront,当 focusGained(FocusEvent e) 事件触发时。
或您可以创建以框架为父级的 JWindow: 新的 JWindow(jframeParent); 这样,您的 JWindow 将收到所有事件。
或 只是使用未修饰的 JFrame 而不是 JWindow
EDIT2:
如果您只是想让 window 位于顶部,当您单击它时,MouseListener 是正确的方法。
解决方案
我将 MouseAdapter
作为 MouseListener
添加到 PointWindow
并且当检测到 mousePressed
事件时执行 toFront()
并且工作正常但是有一个side effect,表示有一个瞬间window是hide and show(非常快)。