Domanda

Detto semplicemente, sto cercando di fare un gioco a cui sto lavorando a pieno schermo.

Ho il seguente codice che sto cercando di utilizzare:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
if(!gs.isFullScreenSupported()) {
    System.out.println("full-screen not supported");
}

Frame frame = new Frame(gs.getDefaultConfiguration());
Window win = new Window(frame);

try {
    // Enter full-screen mode
    gs.setFullScreenWindow(win);
    win.validate();
}

Il problema con questo è che sto lavorando all'interno di una classe che estende JPanel, e anche se ho una variabile di tipo Frame, non ho nessuno tipo di Finestra all'interno della classe.

La mia comprensione del JPanel è che si tratta di una Finestra del genere, ma non posso passare 'questo' in gs.setFullScreenWindow(Finestra di win)...Come faccio a fare questo?

C'è un modo semplice di chiamata, o un metodo simile, utilizzando un JPanel?

C'è un modo che posso ottenere qualcosa del tipo di Finestra dal mio JPanel?

-

EDIT:Il metodo seguente modifica lo stato di JFrame e viene chiamato ogni 10ms:

public void paintScreen()
{
    Graphics g;
    try{
        g = this.getGraphics(); //get Panel's graphic context
        if(g == null)
        {
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setExtendedState(frame.getExtendedState()|JFrame.MAXIMIZED_BOTH);
            frame.add(this);
            frame.pack();
            frame.setResizable(false);
            frame.setTitle("Game Window");
            frame.setVisible(true);
        }
        if((g != null) && (dbImage != null))
        {
            g.drawImage(dbImage, 0, 0, null);
        }
        Toolkit.getDefaultToolkit().sync(); //sync the display on some systems
        g.dispose();
    }
    catch (Exception e)
    {
        if(blockError)
        {
            blockError = false;
        }
        else
        {
            System.out.println("Graphics context error: " + e);
        }
    }
}

Vi anticipo che ci può essere un paio di licenziamenti o di chiamate inutili dopo if(g==null) istruzione (tutti i frame.somethingOrOther s ()), le operazioni di pulitura consiglio sarebbe apprezzato...

Inoltre, il blocco di errore è ciò che sembra.Sto ignorando un errore.L'errore si verifica solo una volta, e questo funziona bene quando l'installazione di ignorare la prima istanza di un errore...Per chi è interessato posso inviare ulteriori info, se qualcuno vuole vedere se tale blocco può essere rimosso, ma io non sono interessato...Potrei guardare in un secondo momento.

È stato utile?

Soluzione

Hai fatto alcun progresso su questo problema? Potrebbe essere utile se si potesse aggiornare la tua domanda con il vostro comportamento previsto e ciò che il codice è in realtà facendo? Come è stato già sottolineato, JFrame è una sottoclasse di Window, quindi se avete un JFrame, non hai bisogno di una finestra.

Per quel che vale, io ho un'applicazione Java che funziona in modalità a schermo intero. Anche se lo schermo non viene ridisegnato come spesso come il vostro, è ridipinto regolarmente. Io la seguente per entrare a pieno schermo:

// pseudo-code; not compilable

JPanel container = new JPanel();
container.setOpaque( true ); // make sure the container will be visible

JFrame frame = new JFrame();
frame.getContentPane().add(container); // add the container to the frame
frame. ... //other initialization stuff, like default close operation, maximize, etc

if ( fullScreenModeIsSupported )
    frame.setUndecorated( true ); // remove window decorations from the frame
    gs.setFullScreenWindow( frame );
    frame.validate();

Poi ogni volta che ho bisogno di aggiornare lo schermo, mi basta collegare un nuovo JPanel nelle JPanel container:

// pseudo-code; not compilable

container.removeAll(); // clean out the container
container.add( jPanelWithNewDisplay ); // add the new display components to the container
container.validate();  // update and redisplay
container.repaint();

Non posso affermare che è tecnicamente perfetto, ma funziona bene per me. Se gli esempi pseudo-codice non tagliare, posso trascorrere del tempo mettendo insieme un esempio compilabile.

Altri suggerimenti

JPanel non è una sottoclasse di finestra . JFrame è.

Quindi, si potrebbe provare:

JFrame yourFrame = new JFrame();
yourFrame.add(yourPanel);

appyYourFullScreenCodeFor( yourFrame );

Che dovrebbe funzionare.

Credo di avere capito di che cosa avete bisogno.

  1. Impostare il telaio decorato, in modo fornito senza alcuna barra del titolo e roba.

  2. Aggiungi il tuo pannello al telaio., così guarda come solo viene mostrato il pannello.

  3. Massimizzare il vostro telaio.Così ora è dovrebbe apparire come c'è solo il tuo pannello di prendere l'intero schermo senza e la finestra di roba.

    fotogramma.setUndecorated(true);fotogramma.add(panel);//ora massimizzare il fotogramma.

Nota:È importante notare che il sintetico API può essere chiamato solo quando il telaio è undisplayable, quindi se già la sua prima mostra, quindi prima è necessario fare setVisible(false).

EDIT1:Se si vuole ottenere la finestra contenente il pannello, allora si può fare questo:

Window win = SwingUtilities.getAncestorOfClass(Window.class, myPanel);

Una volta che si ottiene la finestra di esempio si può passare dove vuoi.

EDIT2:Anche il Frame classe estende Window così si può fare direttamente gs.setFullScreen(frame).Non è necessario creare una nuova finestra per il telaio.

La mia comprensione del JPanel è che è una sorta di Finestra

Perché pensi che?Hai letto le API?Non JPanel si estendono dalla Finestra?

Puoi provare ad usare il SwingUtilities classe.È un metodo che restituisce la Finestra per un determinato componente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top