Javaでは、ユーザーがフォーカスを別のアプリケーションに切り替えたかどうかに関係なく、「常に一番上」のウィンドウを作成する方法はありますか?私はWebを検索しましたが、すべてのソリューションは、ネイティブバインディングを備えたある種のJNIインターフェイスに傾いています。本当にこれがそれをする唯一の方法ではありませんか?..またはそれですか?
Javaでは、ユーザーがフォーカスを別のアプリケーションに切り替えたかどうかに関係なく、「常に一番上」のウィンドウを作成する方法はありますか?私はWebを検索しましたが、すべてのソリューションは、ネイティブバインディングを備えたある種のJNIインターフェイスに傾いています。本当にこれがそれをする唯一の方法ではありませんか?..またはそれですか?
回答:
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 );
}
}
アクティブでない場合でもウィンドウは上部に残ります
私の観察から、AlwaysOnTop特権は、常にトップであることが要求された最新のプロセスに与えられていることがわかりました。
したがって、setAlwaysOnTop(true)
後で別のアプリケーションがこのオプションを使用するアプリケーションがある場合、特権は2番目のアプリケーションに与えられます。これを回避するために、現在のウィンドウの上にウィンドウが表示setAlwaysOnTop(false)
さsetAlwaysOnTop(true)
れるたびに、を設定しました。
でチェックしましwordweb
たwindows
。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();}
}
setFullScreenWindowを使用せず、画面サイズを取得してからsetSizeを取得するだけで、すべて問題なく動作します。