Pourquoi windows XP minimiser mon swing fenêtre plein écran sur mon deuxième écran?

StackOverflow https://stackoverflow.com/questions/53820

  •  09-06-2019
  •  | 
  •  

Question

Dans l'application que je suis en développement (Java/swing), j'ai pour afficher en plein écran sur la fenêtre deuxième l'écran de l'utilisateur.Je l'ai fait à l'aide d'un code semblable à celui que vous trouverez ci-dessous...Être, dès que je clique dans une fenêtre de l'explorateur windows, ou dès que j'ouvre l'explorateur windows (je suis sous windows XP), le plein écran, la fenêtre est réduite au minimum...

Connaissez-vous une manière ou une solution de contournement pour résoudre ce problème, ou est-il quelque chose d'important que je ne comprends pas en plein écran avec windows?

Merci pour l'aide,

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);

    }

}
Était-ce utile?

La solution

Habituellement, lorsqu'une application est en mode "plein écran", il prendra le relais de l'ensemble du bureau.Pour un utilisateur d'accéder à un autre de la fenêtre, ils auraient un alt-tab pour elle.À ce point, windows permettraient de réduire au minimum le plein écran de l'application de sorte que l'autre application pourrait venir à l'avant.

Cela sonne comme il peut être un bug (fonctionnalité non documentée...) dans windows.Il ne devrait probablement pas faire ceci pour une double-écran de configuration.

Une option pour régler ce problème est plutôt que d'être "plein écran" juste faire la fenêtre de la même taille que l'écran de l'emplacement (0,0).Vous pouvez obtenir de l'information d'écran à partir de la GraphicsConfigurations sur le GraphicsDevice.

Autres conseils

Le code suivant fonctionne (merci John).Avec, pas en plein écran et un grand "toujours au dessus" de la fenêtre.Mais je ne sais toujours pas pourquoi windows a provoqué cette stranged comportement...

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top