Java jframe a schermo intero con doppio monitor


Qui il mio problema, ho 2 Jframe, uno per il controllo e uno per la visualizzazione di cose al pubblico. Ho bisogno che il frame del display sia a schermo intero per evitare che i pubblici vedano cose di cui non ha bisogno, e ho bisogno che il frame di controllo sia utilizzabile sull'altro schermo per controllare il frame del display.

Ecco il mio problema, oggi, non ho problemi a lavorare in questo modo in Ubuntu e in una modalità a doppio schermo, ma, in Windows 7 buisness 64 (non provare ancora altre versioni) La cornice del display va effettivamente a schermo intero, ma quando clicco ovunque al di fuori della cornice del display (la cornice di controllo include), la cornice del display viene minimizzata automaticamente. I guest è un problema con Windows minimizzare massimizzare il comportamento, ma mi piace molto farlo funzionare. Conosco una soluzione molto sporca, che consiste nel rendere la cornice del display la dimensione del mio schermo e posizionare la cornice del display sulla buona coordinata.

Ecco un codice di esempio di quello che faccio.
Per mettere la cornice di visualizzazione a schermo intero, mettere a fuoco la cornice di controllo e premere il tasto F11. oppure usa il menu (in francese)

Cornice del gioco.java equivalente alla visualizzazione del frame

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 equivalente al quadro di controllo

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


Modifica1:
Provo a schermo intero entrambe le finestre, ma quando viene chiamato un filechooser, lo stato attivo viene perso a causa del comportamento sempre in primo piano di una finestra a schermo intero.

Modifica 2:
Ho anche provato a mettere un listener sulla visualizzazione iconificata di jframe, ma se provo a cambiare lo stato in NORMALE, la visualizzazione jframe richiede lo stato attivo e il mio secondo fotogramma non può essere utilizzato perché ha perso lo stato attivo

Modifica 3:
Se la cornice del display non è fullscreened, quindi non è minimizzato quando si fa clic sul telaio di controllo.

Author: ROMANIA_engineer, 2012-02-07

2 answers

Quindi qui il mio anwser al mio problema, la soluzione che finalmente uso e penso che sia l'unica soluzione non così brutta che posso trovare è usare questo codice

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

Invece di questo nel mio esempio originale

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

Quindi finalmente non sto usando la funzione java fullscreen e uso solo alcune proprietà del mio jframe per farlo sembrare un frame a schermo intero.

Spero che aiuti alcuni di voi !! buona giornata

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

Questo potrebbe aiutarti

Preferisco il modo personalizzato usato:) e ho trovato questa soluzione quando affronto lo stesso problema, ma il problema è con l'API a schermo intero di Java.

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