창문은 어떻게 정면으로 가져오죠?
원격 제어 메커니즘이 애플리케이션 내에서 무언가를 활성화할 때 전면에 표시해야 하는 Java 애플리케이션이 있습니다.
「」, 「확장자」)로했습니다.JFrame
후는 다음과 같습니다
setVisible(true);
toFront();
Windows XP 에서는 처음 호출할 때 이 기능이 작동하며, 두 번째로 태스크바의 탭만 깜박일 때 프레임이 앞으로 나타나지 않습니다.Win2000도 마찬가지입니다.Vista 에서는 정상적으로 동작하고 있는 것 같다.
좋은 생각 있어요?
생각할 수 있는 해결책은 다음과 같습니다.
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
myFrame.toFront();
myFrame.repaint();
}
});
JFrame
우분투(Java 1.6.0_10)할 수 있는 은 가가 a a a a a a a a a a a a a a a a a를 하는 것입니다.WindowListener
히,, 는 my my my my my my my 를 설정해야 했다.JFrame
toFront()
호출하여 '실행하다'를 제공합니다.windowDeactivated
에서 ""로setAlwaysOnTop(false)
밑줄에 수 요.JFrame
모든 응용 프로그램프레임 도출에 사용됩니다.
@Override
public void setVisible(final boolean visible) {
// make sure that frame is marked as not disposed if it is asked to be visible
if (visible) {
setDisposed(false);
}
// let's handle visibility...
if (!visible || !isVisible()) { // have to check this condition simply because super.setVisible(true) invokes toFront if frame was already visible
super.setVisible(visible);
}
// ...and bring frame to the front.. in a strange and weird way
if (visible) {
toFront();
}
}
@Override
public void toFront() {
super.setVisible(true);
int state = super.getExtendedState();
state &= ~JFrame.ICONIFIED;
super.setExtendedState(state);
super.setAlwaysOnTop(true);
super.toFront();
super.requestFocus();
super.setAlwaysOnTop(false);
}
될 경우 든지 사용할 수 .frame.setVisible(true)
.
9.에 Ubuntu 9.04는 것 .WindowListener
를 기동하기 super.setAlwaysOnTop(false)
할 수 , 이 -- 「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」로 했습니다.toFront()
★★★★★★★★★★★★★★★★★」setVisible()
.
해 주세요.setVisible()
는, EDT로 할 필요가 있습니다.
Windows 에는, Windows 의 포커스를 가로채는 것을 방지하는 기능이 있습니다.대신 태스크바아이콘이 점멸합니다.XP에서는 기본적으로 켜져 있습니다(Tweak을 사용하는 것 이외에는 변경할 수 없습니다).UI가 있지만 레지스트리 설정이 어딘가에 있습니다.Vista 에서는, 디폴트의 변경이나, 유저가 곧바로 사용할 수 있는 UI 의 설정으로 공개하고 있는 경우가 있습니다.
Windows 2K(저도 그것에 감사하고 있습니다)부터, 윈도우가 스스로 앞으로 밀리는 것을 방지해, 포커스를 맞추는 것이 하나의 기능입니다.
즉, 작업 중 활동을 기록하도록 알려주는 작은 Java 앱이 있으며, 30분마다 활성화 창이 나타납니다(물론 구성 가능).Windows XP에서는 항상 정상적으로 동작하며 제목 표시줄 창이 깜박이지 않습니다.타이머 이벤트 발생의 결과로 UI 스레드에서 호출되는 다음 코드를 사용합니다.
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
(최소화된 경우 첫 번째 행이 복원됩니다.)실제로 최대화되면 복구가 되지만, 저는 그런 적이 없습니다.)
저는 보통 이 앱을 최소화하지만, 텍스트 에디터 뒤에 있는 경우가 많습니다.그리고 내가 말했듯이, 그건 항상 효과가 있어.
setVisible() 호출과 레이스 조건이 있을 수 있습니다.toFront()는 호출 시 실제로 창이 표시되지 않는 한 유효하지 않을 수 있습니다.이 문제는 이전에 requestFocus()에서 발생한 적이 있습니다.윈도 활성화이벤트에서는 UI 리스너에 toFront() 콜을 넣어야 할 수 있습니다.
2014-09-07: Java 6 또는 7에서 위와 같은 코드가 작동하지 않게 된 적이 있습니다.조사와 실험 후 이 코드를 업데이트하여 윈도우를 오버라이드해야 했습니다.toFront
method는 다음과 같이 수행합니다(위의 수정 코드와 함께).
setVisible(true);
toFront();
requestFocus();
repaint();
...
public @Override void toFront() {
int sta = super.getExtendedState() & ~JFrame.ICONIFIED & JFrame.NORMAL;
super.setExtendedState(sta);
super.setAlwaysOnTop(true);
super.toFront();
super.requestFocus();
super.setAlwaysOnTop(false);
}
Java 8_20 현재 이 코드는 정상적으로 동작하고 있는 것 같습니다.
다음은 실제로 작동하는 방법입니다(Windows Vista에서 테스트 완료).d
frame.setExtendedState(JFrame.ICONIFIED);
frame.setExtendedState(fullscreen ? JFrame.MAXIMIZED_BOTH : JFrame.NORMAL);
전체 화면 변수는 앱이 전체 화면을 실행할지 아니면 창을 실행할지를 나타냅니다.
이렇게 하면 작업 표시줄이 깜박이지 않지만 창이 안정적으로 앞에 표시됩니다.
Hj, Fedora KDE 14에서는 당신의 모든 방법이 나에게 효과가 없습니다.Oracle이 이 문제를 해결하기를 기다리는 동안 창을 앞으로 가져오는 더러운 방법이 있습니다.
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.InputEvent;
public class FrameMain extends javax.swing.JFrame {
//...
private final javax.swing.JFrame mainFrame = this;
private void toggleVisible() {
setVisible(!isVisible());
if (isVisible()) {
toFront();
requestFocus();
setAlwaysOnTop(true);
try {
//remember the last location of mouse
final Point oldMouseLocation = MouseInfo.getPointerInfo().getLocation();
//simulate a mouse click on title bar of window
Robot robot = new Robot();
robot.mouseMove(mainFrame.getX() + 100, mainFrame.getY() + 5);
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
//move mouse to old location
robot.mouseMove((int) oldMouseLocation.getX(), (int) oldMouseLocation.getY());
} catch (Exception ex) {
//just ignore exception, or you can handle it as you want
} finally {
setAlwaysOnTop(false);
}
}
}
//...
}
그리고 이것은 Fedora KDE 14에서 완벽하게 동작합니다:-)
네 대답을 시험해 봤는데 스테판 라이히의 대답만 통했어창을 이전 상태(최대화/정상)로 복원할 수 없었습니다.나는 이 돌연변이가 더 낫다는 것을 알았다.
view.setState(java.awt.Frame.ICONIFIED);
view.setState(java.awt.Frame.NORMAL);
그것은setState
대신setExtendedState
.
Windows 7 에서는, 다음의 간단한 방법이 완벽하게 기능했습니다.
private void BringToFront() {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
if(jFrame != null) {
jFrame.toFront();
jFrame.repaint();
}
}
});
}
플랫폼 간에 불일치가 발생하지 않는 가장 간단한 방법:
setVisible(false), setVisible(true);
.toFrame()의 JFrame을 실행했을 때의 동작을 제어하는 규칙은 Windows와 Linux에서 동일합니다.
-> 기존 응용 프로그램의 창이 현재 포커스 창일 경우 요청된 창으로 포커스 스왑합니다.-> 그렇지 않으면 태스크바에서 창이 깜박일 뿐입니다.
하지만:
-> 새 창은 자동으로 포커스를 잡습니다.
그럼 이걸 이용합시다!앞으로 창을 가져오려면 어떻게 해야 하죠?
- 빈 비목적 창 만들기
- 보여줘
- 화면에 표시될 때까지 기다립니다(setVisible은 그렇게 합니다).
- 표시된 경우 포커스를 실제로 가져올 창에 대해 포커스를 요청합니다.
- 빈 창을 숨기다, 파괴하다
또는 자바 코드:
// unminimize if necessary
this.setExtendedState(this.getExtendedState() & ~JFrame.ICONIFIED);
// don't blame me, blame my upbringing
// or better yet, blame java !
final JFrame newFrame = new JFrame();
newFrame.add(new JLabel("boembabies, is this in front ?"));
newFrame.pack();
newFrame.setVisible(true);
newFrame.toFront();
this.toFront();
this.requestFocus();
// I'm not 100% positive invokeLater is necessary, but it seems to be on
// WinXP. I'd be lying if I said I understand why
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
newFrame.setVisible(false);
}
});
창을 숨겼다가 다시 표시할 때 포커스가 흐트러지지 않도록 하려면 다음 절차만 수행합니다.
setExtendedState(JFrame.NORMAL);
다음과 같은 경우:
defaultItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
showWindow();
setExtendedState(JFrame.NORMAL);
}
});
javadoc에는 문제의 원인이 되고 있는toFront() 메서드에 관한 많은 경고가 있습니다.
하지만 "태스크바의 탭만 깜박이면" 응용 프로그램이 최소화되었을까요?이 경우 javadoc에서 다음 행을 적용할 수 있습니다.
"이 창이 보이면 이 창을 앞으로 가져와서 포커스를 맞춘 창으로 만들 수 있습니다."
언급URL : https://stackoverflow.com/questions/309023/how-to-bring-a-window-to-the-front
'sourcecode' 카테고리의 다른 글
평면상의 4개의 점이 직사각형을 형성하는지 알아보시겠습니까? (0) | 2022.09.14 |
---|---|
C# 어플리케이션에서 Mariadb로의 접속 (0) | 2022.09.14 |
기본 생성자와 인라인 필드 초기화 (0) | 2022.09.14 |
MySQL에서 임시 암호를 자동으로 생성한 후 액세스할 수 없습니다. (0) | 2022.09.14 |
JRE 또는 JDK가 설치되어 있는지 확인하는 방법 (0) | 2022.09.14 |