Java를 사용하는 "Always on Top"Windows


85

Java에서 사용자가 포커스를 다른 응용 프로그램으로 전환하더라도 "항상 맨 위에"있는 창을 가질 수있는 방법이 있습니까? 나는 웹을 검색했으며 모든 솔루션은 네이티브 바인딩을 사용하는 일종의 JNI 인터페이스에 의존합니다. 정말 이것이 유일한 방법은 아닐까요? .. 아니면 그럴까요?

답변:


159

Window수업 방법을 시도하십시오 .

Window.setAlwaysOnTop (boolean)

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 application always on top"에 대한 간단한 검색이이 대답을 가질 것이라고 생각할 수 있지만 찾을 수 없습니다. 감사.
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에서 확인했습니다 windows. WordWeb은 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();}
    }

다른 창이 맨 위에 올 때이를 false 및 true로 다시 설정하는 것은 한 가지 간단한 이유 때문에 실행 가능한 솔루션처럼 들리지 않습니다. 다른 응용 프로그램이 동일한 작업을 수행하면 어떻게 될까요?
Trejkaz 2015-04-13

@Trejkaz 글쎄, 그것은 유효한 포인트입니다. 나는 더 이상 스윙과 접촉하지 않습니다.
pinkpanther

이것은 내 사용 사례에서 완벽하게 작동합니다! 먼저 false로 다시 설정하는 것이 중요했습니다.
로코코

0

setFullScreenWindow를 사용하지 말고 화면 크기를 얻은 다음 setSize를 사용하면 모든 것이 잘 될 것입니다.


답변 또는 의견입니까?
과학자 실패

영광 코멘트 @FailedScientist
clankill3r
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.