Windows XP为什么要在第二个屏幕上最小化我的全屏摇摆窗口?
时间:2020-03-05 18:50:39 来源:igfitidea点击:
在我正在开发的应用程序中(使用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上的GraphicsConfigurations获取屏幕信息。
回答
以下代码有效(感谢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; }