Pertanyaan "Always on Top" Windows dengan Java


Di Java, apakah ada cara untuk memiliki jendela yang "Selalu di atas" terlepas apakah pengguna beralih fokus ke aplikasi lain? Saya telah mencari di web, dan semua solusinya condong ke semacam antarmuka JNI dengan binding asli. Sungguh ini tidak bisa menjadi satu-satunya cara untuk melakukannya? .. atau itu?


76
2017-11-18 05:37


asal


Jawaban:


Coba metode ini Window kelas:

Window.setAlwaysOnTop (boolean)

Ia bekerja dengan cara yang sama seperti default di Windows TaskManager: beralih ke aplikasi lain tetapi selalu tampil di atas.

Ini ditambahkan di Java 1.5

Kode sampel:

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

Jendela tetap di atas bahkan ketika tidak aktif


139
2017-11-18 05:46



Dari pengamatan saya, saya menemukan bahwa hak istimewa AlwaysOnTop diberikan kepada proses terbaru yang meminta untuk selalu berada di atas.

Jadi, jika Anda memiliki aplikasi yang mana setAlwaysOnTop(true) dan kemudian aplikasi lain menggunakan opsi ini, privilege diberikan ke aplikasi kedua. Untuk mengatasi ini, saya telah mengaturnya setAlwaysOnTop(false) dan lagi setAlwaysOnTop(true) setiap kali ada jendela yang muncul di atas jendela saat ini.

Saya sudah memeriksanya wordweb di windows. WordWeb adalah salah satu aplikasi yang menggunakan AlwaysOnTop opsi dari OS

Saya tidak yakin apakah itu bekerja dengan baik dengan skenario permainan Anda.

PERINGATAN: Saya tidak menyadari efek sampingnya.

Berikut adalah contoh kode:

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
2018-01-04 16:15



jangan gunakan setFullScreenWindow, dapatkan ukuran layar dan setSize, dan semuanya akan baik-baik saja.


0
2017-07-22 03:11