Windows “Always on Top” với Java


85

Trong Java, có cách nào để có một cửa sổ "Luôn ở trên cùng" bất kể người dùng chuyển tiêu điểm sang ứng dụng khác không? Tôi đã tìm kiếm trên web và tất cả các giải pháp đều dựa vào một số loại giao diện JNI với các ràng buộc gốc. Thực sự đây không thể là cách duy nhất để làm điều đó? .. hay là nó?

Câu trả lời:


159

Hãy thử phương pháp này của Windowlớp:

Window.setAlwaysOnTop (boolean)

Nó hoạt động giống như cách mặc định trong Windows TaskManager: chuyển sang một ứng dụng khác nhưng nó luôn hiển thị ở trên cùng.

Điều này đã được thêm vào Java 1.5

Mã mẫu:

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

văn bản thay thế

Cửa sổ vẫn ở trên cùng ngay cả khi không hoạt động


3
bạn sẽ nghĩ rằng một tìm kiếm đơn giản cho "ứng dụng java luôn ở trên cùng" sẽ có câu trả lời này, nhưng nó không thể tìm thấy nó. Cảm ơn.
Laplie Anderson

46
Đoán xem. Bây giờ nó đã làm !! :) Nó đưa bạn đến đây! google.com/search?&q=java+application+always+on+top
OscarRyz

Điều này thật đơn giản và tuyệt vời. Tôi cũng đang tìm kiếm một cái gì đó như thế này, nhưng không biết họ đã triển khai điều này trong Java 1.5. Cảm ơn vì đăng.
Kushal Paudyal

2
Rất tiếc, điều này không hoạt động đối với tôi khi chạy ứng dụng toàn màn hình chẳng hạn như trò chơi điện tử. Có ai biết cách để buộc nó lên đỉnh trong tình huống đó không?
Dream Lane

1
@Dream lane Tôi có lẽ sẽ hỏi điều đó như một câu hỏi mới
rogerdpack

11

Từ quan sát của tôi, tôi thấy rằng đặc quyền AlwaysOnTop được trao cho quy trình mới nhất được yêu cầu luôn ở trên cùng.

Vì vậy, nếu bạn có một ứng dụng setAlwaysOnTop(true)và sau đó là một ứng dụng khác sử dụng tùy chọn này, thì đặc quyền sẽ được trao cho ứng dụng thứ hai. Để giải quyết vấn đề này, tôi đã đặt setAlwaysOnTop(false)và đặt lại setAlwaysOnTop(true)bất cứ khi nào bất kỳ cửa sổ nào ở trên cửa sổ hiện tại.

Tôi đã kiểm tra nó với wordwebtrong windows. WordWeb là một trong những ứng dụng sử dụng AlwaysOnToptùy chọn từOS

Tôi không chắc liệu nó có hoạt động đúng với kịch bản trò chơi của bạn hay không.

Cảnh báo : Tôi không biết về các tác dụng phụ.

Đây là ví dụ mã:

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

Đặt lại thành false và true khi một cửa sổ khác ở trên cùng có vẻ không phải là một giải pháp khả thi vì một lý do đơn giản - điều gì sẽ xảy ra nếu ứng dụng khác làm điều tương tự?
Trejkaz

@Trejkaz Chà, đó là một điểm hợp lệ. Bây giờ tôi không còn liên lạc với swing nữa.
pinkpanther

Điều này hoạt động hoàn hảo cho trường hợp sử dụng của tôi! Đặt nó trở lại false trước tiên là chìa khóa.
rococo

0

không sử dụng setFullScreenWindow, chỉ cần lấy kích thước màn hình và sau đó setSize, và mọi thứ sẽ ổn.


Nó là một câu trả lời hoặc bình luận?
Nhà khoa học thất bại

@FailedScientist một nhận xét được tôn vinh
clankill3r
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.