2008-09-10 5 views
3

Dans l'application que je développe (en Java/swing), je dois montrer une fenêtre en plein écran sur l'écran deuxième de l'utilisateur. Je l'ai fait en utilisant un code similaire à celui que vous trouverez ci-dessous ... Soyez, dès que je clique dans une fenêtre ouverte par Windows Explorer, ou dès que j'ouvre Windows Explorer (j'utilise Windows XP), la fenêtre plein écran est réduite ...Pourquoi Windows XP minimise-t-il la fenêtre plein écran de mon deuxième écran?

Savez-vous un moyen ou une solution de contournement pour résoudre ce problème, ou y a-t-il quelque chose d'important que je n'ai pas compris avec les fenêtres plein écran?

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

    } 

} 

Répondre

1

Habituellement, quand une application est en mode « plein écran », il prendra en charge l'ensemble du bureau. Pour qu'un utilisateur puisse accéder à une autre fenêtre, il lui faudrait alt-tab. À ce stade, les fenêtres réduiraient l'application en plein écran afin que l'autre application puisse apparaître au premier plan.

Cela semble être un bogue (fonctionnalité non documentée ...) dans Windows. Cela ne devrait probablement pas être le cas pour une configuration à double écran.

Une option pour résoudre ceci est plutôt que de le configurer pour être en "plein écran", il suffit de faire de la fenêtre la même taille que l'écran avec l'emplacement (0,0). Vous pouvez obtenir des informations sur l'écran à partir du GraphicsConfigurations on the GraphicsDevice.

+0

Faire la fenêtre de la même taille que l'écran était mon option d'urgence. Je vais essayer et je rapporterai le résultat ... Mais je suis curieux de savoir si le comportement de Windows avec les applications en plein écran est documenté quelque part. –

1

Le code suivant fonctionne (merci John). Sans écran plein et une grande fenêtre "toujours sur le dessus". Mais je ne sais toujours pas pourquoi les fenêtres ont provoqué ce comportement stranged ...

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