Java plein écran jframe avec double moniteur


Ici mon problème, j'ai 2 Jframe, un pour contrôler et un pour afficher les choses au public. J'ai besoin que le cadre d'affichage soit en plein écran pour éviter que les publics voient des choses dont ils n'ont pas besoin, et j'ai besoin que le cadre de contrôle soit utilisable sur l'autre écran pour contrôler le cadre d'affichage.

Voici mon problème, aujourd'hui, je n'ai aucun problème à travailler de cette façon dans Ubuntu et un mode double écran, mais, dans Windows 7 buisness 64 (n'essayez pas encore une autre version), Le cadre d'affichage passe en plein écran, mais lorsque je clique n'importe où en dehors du cadre d'affichage (cadre de contrôle inclus), le cadre d'affichage est automatiquement minimisé. J'invite c'est un problème avec Windows minimiser maximiser le comportement, mais j'aime vraiment le faire fonctionner. Je connais une solution de contournement très sale, qui consiste à faire du cadre d'affichage la taille de mon écran et à positionner le cadre d'affichage aux bonnes coordonnées.

Voici un exemple de code de ce que je fais.
Pour mettre le cadre d'affichage en plein écran, concentrez le cadre de contrôle et appuyez sur la touche F11 . ou utiliser le menu (en français)

GameFrame.java équivalent à l'affichage d'image

package ihm;
import java.awt.Graphics;  
import java.awt.Image;  
import javax.swing.plaf.basic.BasicTabbedPaneUI;

public class GameFrame extends javax.swing.JFrame {

    public GameFrame() {
        initComponents();
    }


    @SuppressWarnings("unchecked")              
    private void initComponents() {

        mainPanel = new javax.swing.JTabbedPane();
        gamePanel = new javax.swing.JPanel(){
            public void paintComponent(Graphics g){
                super.paintComponent(g);
                if(backgroundImage != null){
                    g.drawImage(backgroundImage, 0, 0, this.getWidth(),this.getHeight(),null);
                }
            }
        };
        votePanel = new javax.swing.JPanel();
        countdownPanel = new javax.swing.JPanel();
        bienvenuePanel = new javax.swing.JPanel();
        adsPanel = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("ImproAffichage");
        setAlwaysOnTop(true);
        setBackground(new java.awt.Color(255, 179, 0));
        setForeground(java.awt.Color.white);
        setUndecorated(true);
        getContentPane().setLayout(new java.awt.GridLayout(1, 1));

        mainPanel.setTabLayoutPolicy(javax.swing.JTabbedPane.SCROLL_TAB_LAYOUT);

        gamePanel.setBackground(new java.awt.Color(255, 168, 0));
        gamePanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(40, 40, 40, 40));
        gamePanel.setMinimumSize(new java.awt.Dimension(200, 200));
        gamePanel.setLayout(new java.awt.GridLayout(2, 2, 70, 70));
        mainPanel.addTab("score", gamePanel);

        votePanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
        votePanel.setLayout(new java.awt.GridLayout(1, 0));
        mainPanel.addTab("vote", votePanel);

        countdownPanel.setLayout(new java.awt.GridLayout(1, 0));
        mainPanel.addTab("decompte", countdownPanel);

        bienvenuePanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
        bienvenuePanel.setLayout(new java.awt.GridLayout(1, 0));
        mainPanel.addTab("Bienvenue", bienvenuePanel);

        adsPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
        adsPanel.setLayout(new java.awt.GridLayout(1, 0));
        mainPanel.addTab("publicité", adsPanel);

        getContentPane().add(mainPanel);
        mainPanel.setUI(new BasicTabbedPaneUI() {

            protected int calculateTabAreaHeight(int tab_placement, int run_count, int max_tab_height) {
                return 0;
            }
        });

        pack();
     }                      


    public static void main(String args[]) {
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(GameFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(GameFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(GameFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(GameFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new GameFrame().setVisible(true);
            }
        });
    }
    private static GameFrame instance;
    private Image backgroundImage;
    private Image decompteImage;
    private Image bienvenueImage;
    // Variables declaration - do not modify                     
    private javax.swing.JPanel adsPanel;
    private javax.swing.JPanel bienvenuePanel;
    private javax.swing.JPanel countdownPanel;
    private javax.swing.JPanel gamePanel;
    private javax.swing.JTabbedPane mainPanel;
    private javax.swing.JPanel votePanel;
    // End of variables declaration                   


    public static GameFrame getInstance() {
        if (instance == null) {
            instance = new GameFrame();
        }
        return instance;
    }

    public void refresh() {
        this.validate();
        this.repaint();
        this.pack();
    }
}  



ControlFrame.java équivalent au cadre de contrôle

package ihm;
import java.awt.Dimension;
import java.awt.GraphicsDevice; 
public class ControlFrame extends javax.swing.JFrame {

    public static ControlFrame getInstance() {
        if (instance == null) {
            instance = new ControlFrame();
        }
        return instance;
    }

    private ControlFrame() {
        this.gameFrame = GameFrame.getInstance();
        this.gameFrame.setBounds(100, 100, 400, 300);
        this.gameFrame.pack();
        this.gameFrame.setVisible(true);
        initComponents();
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {
        transitionPanel = new javax.swing.JPanel();
        jbBienvenue = new javax.swing.JButton();
        jbScore = new javax.swing.JButton();
        jbVote = new javax.swing.JButton();
        jbDecompte = new javax.swing.JButton();
        jbPublicite = new javax.swing.JButton();
        jpPlayerControl = new javax.swing.JPanel();
        jMenuBar1 = new javax.swing.JMenuBar();
        mainMenu = new javax.swing.JMenu();
        jmScore = new javax.swing.JMenu();
        jmiAddTeam = new javax.swing.JMenuItem();
        jmiFullscreen = new javax.swing.JMenuItem();
        jmiBackground = new javax.swing.JMenuItem();
        jMenuItem1 = new javax.swing.JMenuItem();
        jmiPointPath = new javax.swing.JMenuItem();
        jmOtherImage = new javax.swing.JMenu();
        jmiVote = new javax.swing.JMenuItem();
        jmiDecompte = new javax.swing.JMenuItem();
        jmiBienvenue = new javax.swing.JMenuItem();
        jmiAds = new javax.swing.JMenuItem();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("ImproContro");
        setAlwaysOnTop(true);
        setBounds(new java.awt.Rectangle(0, 0, 200, 300));
        setForeground(java.awt.Color.white);
        setPreferredSize(new java.awt.Dimension(400, 500));
        setResizable(false);
        getContentPane().setLayout(new java.awt.BorderLayout(25, 25));
        transitionPanel.setLayout(new java.awt.GridLayout(1, 6));
        jbBienvenue.setText("Bienvenue");
        transitionPanel.add(jbBienvenue);
        jbScore.setText("Score");
        transitionPanel.add(jbScore);
        jbVote.setText("Aux votes");
        transitionPanel.add(jbVote);
        jbDecompte.setText("Decompte");
        transitionPanel.add(jbDecompte);
        jbPublicite.setText("Publicité");
        transitionPanel.add(jbPublicite);
        getContentPane().add(transitionPanel, java.awt.BorderLayout.PAGE_START);
        jpPlayerControl.setBackground(new java.awt.Color(255, 220, 0));
        jpPlayerControl.setLayout(new java.awt.GridLayout(2, 2, 10, 10));
        getContentPane().add(jpPlayerControl, java.awt.BorderLayout.CENTER);
        mainMenu.setText("File");
        jMenuBar1.add(mainMenu);
        jmScore.setText("Score");
        jmiAddTeam.setText("ajouter equipe");
        jmScore.add(jmiAddTeam);
        jmiFullscreen.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F11, 0));
        jmiFullscreen.setText("Plein Ecran");
        jmScore.add(jmiFullscreen);
        jmiBackground.setText("image \"fond score\"");
        jmScore.add(jmiBackground);
        jMenuItem1.setText("couleur \"fond score\"");
        jmScore.add(jMenuItem1);
        jmiPointPath.setText("Icone de point");
        jmScore.add(jmiPointPath);
        jMenuBar1.add(jmScore);
        jmOtherImage.setText("Autre images");
        jmiVote.setText("image \"aux votes\"");
        jmOtherImage.add(jmiVote);
        jmiDecompte.setText("image \"fond Decompte\"");
        jmOtherImage.add(jmiDecompte);
        jmiBienvenue.setText("image \"Bienvenue\"");
        jmOtherImage.add(jmiBienvenue);
        jmiAds.setText("Ajouter image annonce");
        jmOtherImage.add(jmiAds);
        jMenuBar1.add(jmOtherImage);
        setJMenuBar(jMenuBar1);
        jmiFullscreen.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F11, 0));

        jmiFullscreen.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jmiFullscreenActionPerformed(evt);
            }
        });
        pack();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(ControlFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(ControlFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(ControlFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ControlFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        /*
         * * Create and display the form
         */        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                ControlFrame.getInstance().setVisible(true);
            }
        });
    }

    private void jmiFullscreenActionPerformed(java.awt.event.ActionEvent evt) {
        GraphicsDevice gd = this.gameFrame.getGraphicsConfiguration().getDevice();

        if (gd.getFullScreenWindow() != null) {
            gd.setFullScreenWindow(null);
            this.gameFrame.setResizable(true);
            this.gameFrame.setPreferredSize(new Dimension(400, 300));
        } else {
            this.gameFrame.setResizable(false);
            this.gameFrame.setPreferredSize(new Dimension(gd.getDefaultConfiguration().getBounds().getSize()));
            this.gameFrame.enableInputMethods(false);
            gd.setFullScreenWindow(this.gameFrame);
        }
        refresh();
    }
    private static ControlFrame instance;
    private GameFrame gameFrame;
    // Variables declaration - do not modify
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JButton jbBienvenue;
    private javax.swing.JButton jbDecompte;
    private javax.swing.JButton jbPublicite;
    private javax.swing.JButton jbScore;
    private javax.swing.JButton jbVote;
    private javax.swing.JMenu jmOtherImage;
    private javax.swing.JMenu jmScore;
    private javax.swing.JMenuItem jmiAddTeam;
    private javax.swing.JMenuItem jmiAds;
    private javax.swing.JMenuItem jmiBackground;
    private javax.swing.JMenuItem jmiBienvenue;
    private javax.swing.JMenuItem jmiDecompte;
    private javax.swing.JMenuItem jmiFullscreen;
    private javax.swing.JMenuItem jmiPointPath;
    private javax.swing.JMenuItem jmiVote;
    private javax.swing.JPanel jpPlayerControl;
    private javax.swing.JMenu mainMenu;
    private javax.swing.JPanel transitionPanel;
    // End of variables declaration

    public void refresh() {
        System.out.println("refresh()");
        this.gameFrame.refresh();
        this.validate();
        this.repaint();
    }
}


Edit1:
J'essaie de fullscreen les deux fenêtres, mais quand un filechooser est appelé, le focus est perdu à cause du comportement toujours au top d'une fenêtre plein écran.

Modifier 2:
J'ai également essayé de mettre un écouteur sur l'affichage iconifié de jframe, mais si j'essaie de changer d'état en NORMAL, l'affichage de la demande jframe focus, et ma deuxième image ne peut pas être utilisée car elle a perdu le focus

Modifier 3:
Si le cadre d'affichage n'est pas pleinécran, il n'est pas minimisé lorsque vous cliquez sur le cadre de contrôle.

Author: ROMANIA_engineer, 2012-02-07

2 answers

Donc voici mon propre anwser à mon propre problème, la solution de contournement que j'utilise enfin et je pense que la seule solution de contournement pas si laide que je puisse trouver est d'utiliser ce code

private void jmiFullscreenActionPerformed(java.awt.event.ActionEvent evt) {                                              
     GraphicsDevice gd = this.gameFrame.getGraphicsConfiguration().getDevice();

    if (!this.gameFrame.isResizable() ) {
        //gd.setFullScreenWindow(null);
        this.gameFrame.setResizable(true);
        this.gameFrame.setPreferredSize(new Dimension(400, 300));
    } else {
        this.gameFrame.setResizable(false);
        this.gameFrame.setPreferredSize(new Dimension(gd.getDefaultConfiguration().getBounds().getSize()));
        this.gameFrame.setExtendedState(Frame.MAXIMIZED_BOTH);
    }
    refresh();
}           

Au Lieu de cela dans mon premier exemple

private void jmiFullscreenActionPerformed(java.awt.event.ActionEvent evt) {
    GraphicsDevice gd = this.gameFrame.getGraphicsConfiguration().getDevice();

    if (gd.getFullScreenWindow() != null) {
        gd.setFullScreenWindow(null);
        this.gameFrame.setResizable(true);
        this.gameFrame.setPreferredSize(new Dimension(400, 300));
    } else {
        this.gameFrame.setResizable(false);
        this.gameFrame.setPreferredSize(new Dimension(gd.getDefaultConfiguration().getBounds().getSize()));
        this.gameFrame.enableInputMethods(false);
        gd.setFullScreenWindow(this.gameFrame);
    }
    refresh();
}

Donc finalement je n'utilise pas la fonction java fullscreen et j'utilise juste certaines propriétés de mon jframe pour le faire ressembler à un cadre plein écran.

J'espère que cela aidera certains d'entre vous !! avoir une belle journée

 2
Author: Kiwy, 2012-02-13 18:22:56

Ce peut vous aider à

Je préfère la manière personnalisée que vous avez utilisée :) et je suis venu avec cette solution lorsque je suis confronté au même problème, mais le problème concerne l'API plein écran de Java.

 0
Author: Argha Das, 2017-12-20 05:13:32