Javaを搭載した「AlwaysonTop」Windows


85

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

回答:


159

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

Window.setAlwaysOnTop(boolean)

これは、Windowsタスクマネージャーのデフォルトと同じように機能します。別のアプリに切り替えますが、常に一番上に表示されます。

これはJava1.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

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


3
「Javaアプリケーションが常に一番上にある」という単純な検索でこの答えが得られると思うかもしれませんが、それは見つかりませんでした。ありがとう。
Laplie Anderson

46
何だと思う。今ではそうです!! :)それはあなたをここに連れて来ます!google.com/search?&q=java+application+always+on+top
OscarRyz 2009年

これはシンプルで素晴らしいです。私もこのようなものを探していましたが、Java1.5でこれを実装していることを知りませんでした。投稿していただきありがとうございます。
Kushal Paudyal 2009年

2
残念ながら、ビデオゲームなどのフルスクリーンアプリケーションを実行している場合、これは機能しません。その状況でそれをトップに強制する方法を知っている人はいますか?
ドリームレーン

1
@Dream laneおそらく新しい質問としてそれを尋ねるでしょう
rogerdpack

11

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

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

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

それがあなたのゲームシナリオで適切に機能するかどうかはわかりません。

警告:私は副作用に気づいていません。

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

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();}
    }

別のウィンドウが表示されたときにfalseとtrueに再度設定すると、1つの単純な理由で、実行可能な解決策のようには聞こえません。他のアプリケーションが同じことを行う場合はどうなりますか?
Trejkaz 2015

@Trejkazまあ、それは有効なポイントです。私はもうスイングに触れていません。
ピンクパンサー2015

これは私のユースケースで完全に機能します!最初にfalseに戻すことが重要でした。
ロココ2017年

0

setFullScreenWindowを使用せず、画面サイズを取得してからsetSizeを取得するだけで、すべて問題なく動作します。


それは答えですか、それともコメントですか?
失敗した科学者

栄光コメント@FailedScientist
clankill3r
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.