Pregunta

En pocas palabras, estoy tratando de hacer un juego en el que estoy trabajando en pantalla completa.

Tengo el siguiente código que estoy tratando de usar:

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

El problema con esto es que estoy trabajando dentro de una clase que extiende jpanel, y aunque tengo una variable de trama de tipo, no tengo ninguna ventana de tipo dentro de la clase.

Entiendo que JPanel es que es una especie de ventana, pero no puedo pasar 'esto' en Gs.SetfulLScreenWindow (Window Win) ... ¿Cómo debo hacer esto?

¿Hay alguna forma fácil de llamar a ese o un método similar, utilizando un JPanel?

¿Hay alguna manera de obtener algo de la ventana tipo de mi jpanel?

-

Editar: el siguiente método cambia el estado de Jframe y se llama cada 10 ms:

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

Anticipo que puede haber algunas redundancias o llamadas innecesarias después de la declaración if (g == null) (todo el marco.

Además, el error de bloque es lo que parece. Estoy ignorando un error. El error solo ocurre una vez, y esto funciona bien cuando se configura para ignorar la primera instancia del error ... Para cualquier persona interesada, puedo publicar información adicional allí si alguien quiere ver si ese bloque se puede eliminar, pero no me preocupa ... Podría investigarlo más tarde.

¿Fue útil?

Solución

¿Has hecho algún progreso en este problema? Puede ser útil si pudiera actualizar su pregunta con su comportamiento esperado y ¿qué está haciendo realmente el código? Como ya se señaló, Jframe es una subclase de ventana, por lo que si tiene un Jframe, no necesita una ventana.

Por lo que vale, tengo una aplicación Java que funciona en modo de pantalla completa. Aunque la pantalla no se reproduce con tanta frecuencia como la suya, se reproduce regularmente. Hago lo siguiente para ingresar a pantalla completa:

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

Luego, cada vez que necesito actualizar la pantalla, solo conecto un nuevo JPanel en el container JPanel:

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

No puedo afirmar que es técnicamente perfecto, pero funciona bien para mí. Si los ejemplos de pseudo-código no lo cortan, puedo pasar un tiempo organizando un ejemplo compilable.

Otros consejos

Jpanel no es una subclase de Ventana. Jframe es.

Entonces podrías intentarlo:

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

appyYourFullScreenCodeFor( yourFrame );

Eso debería funcionar.

Creo que obtuve lo que necesitas.

  1. Establezca el marco sin decorado, por lo que viene sin ninguna barra de título y cosas.

  2. Agregue su panel al marco. Para que parezca que solo se muestra su panel.

  3. Maximice su marco. Así que ahora debería parecer que solo está su panel tomando la pantalla completa sin cosas de la ventana y la ventana.

    Frame.SetUndeCorated (verdadero); Frame.Add (panel); // Ahora maximice su marco.

Nota: Es importante tener en cuenta que la API no decorada solo se puede llamar cuando su marco no se puede mostrar, por lo que si ya se muestra, entonces primero debe hacer setVisible (falso).

Edición1: Si todo lo que desea es obtener la ventana que contenga su panel, entonces puede hacer esto:

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

Una vez que obtenga la instancia de la ventana, puede pasarlo donde quiera.

Edición2: También el Frame la clase se extiende Window para que puedas hacer directamente gs.setFullScreen(frame). No necesita crear una nueva ventana para ese cuadro.

Mi comprensión de JPanel es que es una especie de ventana

¿Por qué piensas eso? ¿Leíste la API? ¿Jpanel se extiende desde la ventana?

Puede intentar usar la clase SwingUtility. Tiene un método que devuelve la ventana para un componente determinado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top