web-dev-qa-db-ja.com

Java

Javaでは、ユーザーが別のアプリケーションにフォーカスを切り替えたかどうかに関係なく、「常に一番上」にあるウィンドウを使用する方法はありますか?私はWebを検索しましたが、すべてのソリューションはネイティブバインディングを備えた何らかのJNIインターフェイスに依存しています。本当にこれを行う唯一の方法ではありませんか?..またはそれですか?

82
Laplie Anderson

Windowクラスの次のメソッドを試してください。

Window.setAlwaysOnTop(boolean)

Windows TaskManagerのデフォルトと同じように機能します:別のアプリに切り替えますが、常に一番上に表示されます。

これはJava 1.5で追加されました

サンプルコード:

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Annoying {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Hello!!");

        // Set's the window to be "always on top"
        frame.setAlwaysOnTop( true );

        frame.setLocationByPlatform( true );
        frame.add( new JLabel("  Isn't this annoying?") );
        frame.pack();
        frame.setVisible( true );
    }
}

alt text

アクティブでない場合でもウィンドウは一番上に残ります

153
OscarRyz

私の観察から、AlwaysOnTop特権は、常に最上位にあることを要求した最新のプロセスに与えられていることがわかりました。

したがって、setAlwaysOnTop(true)以降のアプリケーションがこのオプションを使用するアプリケーションがある場合、特権は2番目のアプリケーションに与えられます。これを回避するために、現在のウィンドウの上にウィンドウが来るたびにsetAlwaysOnTop(false)setAlwaysOnTop(true)を設定しました。

wordwebwindowsで確認しました。 WordWebは、AlwaysOnTopからOSオプションを使用するアプリケーションの1つです。

ゲームシナリオで適切に機能するかどうかはわかりません。

警告:副作用に気付いていません。

コード例は次のとおりです。

import Java.awt.event.*;

import javax.swing.*;

public class MainWindow extends JFrame implements WindowFocusListener
{
    public MainWindow()
    {
        addWindowFocusListener(this);
        setAlwaysOnTop(true);
        this.setFocusable(true);
       // this.setFocusableWindowState(true);
        panel = new JPanel();
        //setSize(WIDTH,HEIGHT);
        setUndecorated(true);
        setLocation(X,Y);
        setExtendedState(MAXIMIZED_BOTH);
        setVisible(true);
    }

    public void windowGainedFocus(WindowEvent e){}
    public void windowLostFocus(WindowEvent e)
    {
        if(e.getNewState()!=e.WINDOW_CLOSED){
            //toFront();
            //requestFocus();
            setAlwaysOnTop(false);
            setAlwaysOnTop(true);
            //requestFocusInWindow();
            System.out.println("focus lost");
        }

    }

    private JPanel panel;
    private static final int WIDTH = 200;
    private static final int HEIGHT = 200;
    private static final int X = 100;
    private static final int Y = 100;

    public static void main(String args[]){
              new MainWindow();}
    }
10
pinkpanther

setFullScreenWindowを使用しないでください。画面サイズを取得してからsetSizeを取得するだけで、すべて問題ありません。

0
X.Zhang