我正在尝试创建一个位于所有其他窗口之上的JFrame - 包括任务栏 - 当它聚焦时,但不是在另一个窗口聚焦时。理想情况下,这样的事情会起作用:
import java.awt.event.*;
import javax.swing.*;
public class FullHeightWindow extends JFrame implements FocusListener {
public FullHeightWindow() {
super("FullHeightWindow");
setSize(100, 10000);
addFocusListener(this);
setVisible(true);
}
public void focusGained(FocusEvent e) {
System.out.println(e.paramString());
setAlwaysOnTop(true);
}
public void focusLost(FocusEvent e) {
System.out.println(e.paramString());
setAlwaysOnTop(false);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new FullHeightWindow());
}
}
但是,对setAlwaysOnTop(false)
的调用会触发另一个focusGained
,这会将窗口设置为始终位于顶部。 (这在Windows 10上,如果重要的话。)
使用Windows API,您必须使用SWP_NOACTIVATE
标志来防止这种情况发生:SetWindowPos(h, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE)
。事实证明,在JNA中完全这样做会有效。但是有没有一种可移植的方式在Java中做这样的事情?
答案 0 :(得分:0)
您可以使用此类其他活动
DefNode.new(children).visibility_scope
#=> RuntimeError: can't modify frozen DefNode