Java ile "Her Zaman Üstte" Windows


85

Java'da, kullanıcının odağı başka bir uygulamaya geçirmesine bakılmaksızın "Her zaman üstte" olan bir pencereye sahip olmanın bir yolu var mı? Web'de arama yaptım ve tüm çözümler yerel bağlamalara sahip bir tür JNI arayüzüne dayanıyor. Gerçekten bunu yapmanın tek yolu bu olamaz? .. yoksa öyle mi?

Yanıtlar:


159

WindowSınıfın bu yöntemini deneyin :

Window.setAlwaysOnTop (boole)

Windows TaskManager'daki varsayılanla aynı şekilde çalışır: başka bir uygulamaya geçin, ancak her zaman en üstte görünür.

Bu, Java 1.5'e eklendi

Basit kod:

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

alternatif metin

Etkin olmasa bile pencere üstte kalır


3
"java uygulaması her zaman en üstte" için basit bir aramanın bu cevabı vereceğini düşünürdünüz, ancak bulamadı. Teşekkürler.
Laplie Anderson

46
Bil bakalım ne oldu. Şimdi öyle !! :) Sizi buraya getiriyor! google.com/search?&q=java+application+always+on+top
OscarRyz

Bu basit ve harika. Ben de bunun gibi bir şey arıyordum ama bunu Java 1.5'te uyguladıklarını bilmiyordum. Gönderdiğiniz için teşekkürler.
Kushal Paudyal

2
Maalesef, video oyunu gibi tam ekran bir uygulama çalıştırırken bu benim için çalışmıyor. Bu durumda onu zirveye çıkarmanın bir yolunu bilen var mı?
Dream Lane

1
@Dream Lane Bunu muhtemelen yeni bir soru olarak
sorardım

11

Gözlemlerime göre AlwaysOnTop ayrıcalığının her zaman en üstte olmayı talep eden son sürece verildiğini gördüm.

Dolayısıyla, setAlwaysOnTop(true)daha sonra başka bir uygulamanın bu seçeneği kullandığı bir uygulamanız varsa , ayrıcalık ikinci uygulamaya verilir. Bunu aşmak için , geçerli pencerenin üstüne herhangi bir pencere geldiğinde setAlwaysOnTop(false)ve tekrar ayarladım setAlwaysOnTop(true).

Ben bunu kontrol ettik wordwebde windows. WordWeb, aşağıdaki AlwaysOnTopseçeneği kullanan uygulamalardan biridir.OS

Oyun senaryonuzla düzgün çalışıp çalışmadığından emin değilim.

Uyarı : Yan etkilerin farkında değilim.

İşte kod örneği:

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

Başka bir pencere en üste geldiğinde bunu yanlış ve doğru olarak ayarlamak, basit bir nedenden ötürü uygulanabilir bir çözüm gibi görünmüyor - ya diğer uygulama da aynı şeyi yaparsa?
Trejkaz

@Trejkaz Evet, bu geçerli bir nokta. Artık salıncakla temas halinde değilim.
pinkpanther

Bu benim kullanım durumum için mükemmel çalışıyor! Önce onu yanlış olarak ayarlamak çok önemliydi.
rococo

0

setFullScreenWindow'u kullanmayın, sadece ekran boyutunu alın ve ardından setSize ve her şey yoluna girecek.


Bu bir cevap mı yoksa yorum mu?
Failed Scientist

@FailedScientist yüceltilmiş bir yorum
clankill3r
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.