Câu hỏi "Luôn luôn trên đầu" Windows với Java


Trong Java, có cách nào để có một cửa sổ "Luôn luôn ở trên đầu" bất kể người dùng có chuyển sang tiêu điểm đến ứ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 liên kết gốc. Thật sự đây không phải là cách duy nhất để làm điều đó? .. hay là nó?


76
2017-11-18 05:37


gốc




Các câu trả lời:


Hãy thử phương pháp này của Window lớp học:

Window.setAlwaysOnTop (boolean)

Nó hoạt động theo cách tương tự như mặc định trong Windows TaskManager: chuyển sang ứ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 trong 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 );
    }
}

alt text

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


139
2017-11-18 05:46



bạn sẽ nghĩ rằng một tìm kiếm đơn giản cho "ứng dụng java luôn luôn trên đầu trang" trên 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
Đoán xem. Bây giờ nó !! :) Nó mang đến cho bạ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ọ thực hiện điều này trong Java 1.5. Cảm ơn vì đăng. - Kushal Paudyal
Thật không may điều này không làm việc cho tôi khi chạy một ứng dụng toàn màn hình như một trò chơi video. Có ai biết cách ép nó lên hàng đầu trong tình huống đó không? - Dream Lane
@Dream lane Tôi có thể hỏi đó là một câu hỏi mới - rogerdpack


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 đó một ứng dụng khác sử dụng tùy chọn này, đặc quyền được cấp cho ứng dụng thứ hai. Để giải quyết vấn đề này, tôi đã đặt setAlwaysOnTop(false) Và một lần nữa setAlwaysOnTop(true) bất cứ khi nào bất kỳ cửa sổ nào xuất hiện trên đầu cửa sổ hiện tại.

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

Tôi không chắc chắn về việ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 các tác dụng phụ.

Đây là ví dụ về 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();}
    }

10
2018-01-04 16:15



Đặt nó thành false và true một lần nữa khi một cửa sổ khác xuất hiện trên đầu không giống như một giải pháp khả thi vì một lý do đơn giản - nếu ứng dụng kia thực hiện điều tương tự thì sao? - Trejkaz
@ Trejkaz Vâng, đó là một điểm hợp lệ. Tôi không còn liên lạc với swing nữa. - pinkpanther
Điều này làm việc cho trường hợp sử dụng của tôi một cách hoàn hảo! Đặt nó trở lại sai trước là chìa khóa. - rococo


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.


0
2017-07-22 03:11



Nó là một câu trả lời hay bình luận? - Failed Scientist