如何创建一个仅在聚焦时始终位于顶部的JFrame?

时间:2017-07-15 04:48:29

标签: java swing

我正在尝试创建一个位于所有其他窗口之上的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中做这样的事情?

1 个答案:

答案 0 :(得分:0)

您可以使用此类其他活动

DefNode.new(children).visibility_scope
#=> RuntimeError: can't modify frozen DefNode