Windows XP가 두 번째 화면에서 스윙 전체 화면 창을 최소화하는 이유는 무엇입니까?
문제
제가 개발 중인 애플리케이션(Java/swing)에서 전체 화면 창을 표시해야 합니다. 두번째 사용자의 화면.아래에서 볼 수 있는 것과 유사한 코드를 사용하여 이 작업을 수행했습니다.Windows 탐색기로 열린 창을 클릭하거나 Windows 탐색기(저는 Windows XP를 사용하고 있습니다)를 열자마자 전체 화면 창이 최소화됩니다...
이 문제를 해결할 수 있는 방법이나 해결 방법을 알고 있습니까? 아니면 전체 화면 창에서 제가 이해하지 못한 중요한 사항이 있습니까?
도와 주셔서 감사합니다,
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JWindow;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Window;
import javax.swing.JButton;
import javax.swing.JToggleButton;
import java.awt.Rectangle;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
public class FullScreenTest {
private JFrame jFrame = null; // @jve:decl-index=0:visual-constraint="94,35"
private JPanel jContentPane = null;
private JToggleButton jToggleButton = null;
private JPanel jFSPanel = null; // @jve:decl-index=0:visual-constraint="392,37"
private JLabel jLabel = null;
private Window window;
/**
* This method initializes jFrame
*
* @return javax.swing.JFrame
*/
private JFrame getJFrame() {
if (jFrame == null) {
jFrame = new JFrame();
jFrame.setSize(new Dimension(474, 105));
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setContentPane(getJContentPane());
}
return jFrame;
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.add(getJToggleButton(), null);
}
return jContentPane;
}
/**
* This method initializes jToggleButton
*
* @return javax.swing.JToggleButton
*/
private JToggleButton getJToggleButton() {
if (jToggleButton == null) {
jToggleButton = new JToggleButton();
jToggleButton.setBounds(new Rectangle(50, 23, 360, 28));
jToggleButton.setText("Show Full Screen Window on 2nd screen");
jToggleButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
showFullScreenWindow(jToggleButton.isSelected());
}
});
}
return jToggleButton;
}
protected void showFullScreenWindow(boolean b) {
if(window==null){
window = initFullScreenWindow();
}
window.setVisible(b);
}
private Window initFullScreenWindow() {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gds = ge.getScreenDevices();
GraphicsDevice gd = gds[1];
JWindow window = new JWindow(gd.getDefaultConfiguration());
window.setContentPane(getJFSPanel());
gd.setFullScreenWindow(window);
return window;
}
/**
* This method initializes jFSPanel
*
* @return javax.swing.JPanel
*/
private JPanel getJFSPanel() {
if (jFSPanel == null) {
jLabel = new JLabel();
jLabel.setBounds(new Rectangle(18, 19, 500, 66));
jLabel.setText("Hello ! Now, juste open windows explorer and see what happens...");
jFSPanel = new JPanel();
jFSPanel.setLayout(null);
jFSPanel.setSize(new Dimension(500, 107));
jFSPanel.add(jLabel, null);
}
return jFSPanel;
}
/**
* @param args
*/
public static void main(String[] args) {
FullScreenTest me = new FullScreenTest();
me.getJFrame().setVisible(true);
}
}
해결책
일반적으로 응용 프로그램이 "전체 화면" 모드에 있으면 전체 데스크톱을 차지하게 됩니다.사용자가 다른 창으로 이동하려면 Alt 키를 눌러야 합니다.그 시점에서 창은 전체 화면 앱을 최소화하여 다른 애플리케이션이 앞으로 나올 수 있도록 합니다.
이는 Windows의 버그(문서화되지 않은 기능...)인 것 같습니다.듀얼 스크린 설정에서는 이 작업을 수행해서는 안 됩니다.
이 문제를 해결하는 한 가지 옵션은 "전체 화면"으로 설정하는 대신 위치(0,0)를 사용하여 창을 화면과 동일한 크기로 만드는 것입니다.다음에서 화면 정보를 얻을 수 있습니다. GraphicsDevice의 그래픽 구성.
다른 팁
다음 코드는 작동합니다(John에게 감사합니다).전체 화면이 없고 큰 "항상 위에 표시" 창이 표시됩니다.하지만 왜 Windows가 이런 이상한 동작을 일으켰는지는 아직도 알 수 없습니다.
private Window initFullScreenWindow() {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gds = ge.getScreenDevices();
GraphicsDevice gd = gds[1];
JWindow window = new JWindow(gd.getDefaultConfiguration());
window.setContentPane(getJFSPanel());
window.setLocation(1280, 0);
window.setSize(gd.getDisplayMode().getWidth(), gd.getDisplayMode().getHeight());
window.setAlwaysOnTop(true);
//gd.setFullScreenWindow(window);
return window;
}
제휴하지 않습니다 StackOverflow