“ อยู่ด้านบนเสมอ” Windows พร้อม Java


85

ใน Java มีวิธีที่จะทำให้หน้าต่าง "อยู่ด้านบนเสมอ" ไม่ว่าผู้ใช้จะเปลี่ยนโฟกัสไปที่แอปพลิเคชันอื่นหรือไม่? ฉันค้นหาเว็บแล้วและวิธีแก้ปัญหาทั้งหมดขึ้นอยู่กับอินเทอร์เฟซ JNI บางประเภทที่มีการผูกแบบเนทีฟ นี่เป็นวิธีเดียวที่จะทำไม่ได้? .. หรือว่า?

คำตอบ:


159

ลองใช้วิธีนี้ของWindowคลาส:

Window.setAlwaysOnTop (บูลีน)

มันทำงานในลักษณะเดียวกับค่าเริ่มต้นใน Windows TaskManager: เปลี่ยนไปใช้แอปอื่น แต่จะแสดงอยู่ด้านบนเสมอ

สิ่งนี้ถูกเพิ่มใน Java 1.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 );
    }
}

ข้อความแสดงแทน

หน้าต่างยังคงอยู่ด้านบนแม้ว่าจะไม่มีการใช้งาน


3
คุณจะคิดว่าการค้นหา "แอปพลิเคชัน java ที่อยู่ด้านบนเสมอ" แบบง่ายๆจะมีคำตอบนี้ แต่ไม่พบ ขอบคุณ.
Laplie Anderson

46
เดาอะไร. ตอนนี้มัน !! :) พาคุณมาที่นี่! google.com/search?&q=java+application+always+on+top
OscarRyz

นี่เป็นเรื่องง่ายและยอดเยี่ยม ฉันกำลังมองหาบางอย่างเช่นนี้ แต่ไม่รู้ว่าพวกเขาใช้สิ่งนี้ใน Java 1.5 ขอบคุณสำหรับการโพสต์
Kushal Paudyal

2
น่าเสียดายที่สิ่งนี้ใช้ไม่ได้สำหรับฉันเมื่อเรียกใช้แอปพลิเคชันแบบเต็มหน้าจอเช่นวิดีโอเกม ใครรู้วิธีบังคับให้ขึ้นสู่จุดสูงสุดในสถานการณ์นั้น?
Dream Lane

1
@ Dream lane ฉันอาจจะถามเป็นคำถามใหม่
rogerdpack

11

จากการสังเกตของฉันฉันพบว่าสิทธิ์ AlwaysOnTop มอบให้กับกระบวนการล่าสุดที่ขอให้อยู่ด้านบนเสมอ

ดังนั้นหากคุณมีแอปพลิเคชันที่แอปพลิเคชันsetAlwaysOnTop(true)อื่นใช้ตัวเลือกนี้ในภายหลังสิทธิ์จะมอบให้กับแอปพลิเคชันที่สอง ในการแก้ไขปัญหานี้ฉันได้ตั้งค่าsetAlwaysOnTop(false)และอีกครั้งsetAlwaysOnTop(true)เมื่อใดก็ตามที่มีหน้าต่างอยู่ด้านบนของหน้าต่างปัจจุบัน

ผมได้ตรวจสอบกับในwordweb windowsWordWeb เป็นหนึ่งในแอปพลิเคชั่นที่ใช้AlwaysOnTopตัวเลือกจากไฟล์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();}
    }

การตั้งค่าเป็นเท็จและเป็นจริงอีกครั้งเมื่อมีหน้าต่างอื่นอยู่ด้านบนไม่ได้เป็นวิธีแก้ปัญหาที่ใช้งานได้ด้วยเหตุผลง่ายๆเพียงข้อเดียว - จะเกิดอะไรขึ้นถ้าแอปพลิเคชันอื่นทำสิ่งเดียวกัน
Trejkaz

@Trejkaz นั่นคือจุดที่ถูกต้อง ตอนนี้ฉันไม่ได้ติดต่อกับวงสวิงแล้ว
pinkpanther

ใช้ได้กับกรณีการใช้งานของฉันอย่างสมบูรณ์แบบ! การตั้งค่ากลับเป็นเท็จก่อนเป็นกุญแจสำคัญ
โคโค

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.