Java에서 사용자가 포커스를 다른 응용 프로그램으로 전환하더라도 “항상 맨 위에”있는 창을 가질 수있는 방법이 있습니까? 나는 웹을 검색했으며 모든 솔루션은 네이티브 바인딩을 사용하는 일종의 JNI 인터페이스에 의존합니다. 정말 이것이 유일한 방법은 아닐까요? .. 아니면 그럴까요?
답변
이 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 );
}
}
창이 활성화되지 않은 경우에도 맨 위에 유지됩니다.
답변
내 관찰에서 나는 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();}
}
답변
setFullScreenWindow를 사용하지 말고 화면 크기를 얻은 다음 setSize를 사용하면 모든 것이 잘 될 것입니다.