Question

Simplement dit, je suis en train de faire un jeu sur lequel je travaille en plein écran.

Je le code suivant, je suis en train d'utiliser:

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

problème est que je travaille au sein d'une classe qui étend JPanel, et pendant que j'ai une variable de type Frame, je ne de type fenêtre dans la classe.

Ma compréhension de JPanel est qu'il est une fenêtre sorte, mais je ne peux pas passer this dans gs.setFullScreenWindow (victoire de la fenêtre) ... Comment dois-je m'y prendre?

Yat-il un moyen facile d'appeler cela, ou une méthode similaire, en utilisant un JPanel?

Y at-il une manière que je peux obtenir quelque chose de type fenêtre de mes JPanel?

-

EDIT: La méthode suivante change l'état de JFrame et est appelé toutes les 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);
        }
    }
}

Je prévois qu'il peut y avoir quelques licenciements ou des appels inutiles après l'instruction if (g == null) (tous les frame.somethingOrOther () s), des conseils de nettoyage serait apprécié ...

En outre, l'erreur de bloc est ce qu'il semble. Je suis ignorant une erreur. L'erreur se produit qu'une seule fois, et cela fonctionne très bien lorsque l'installation d'ignorer la première instance de l'erreur ... Pour toute personne intéressée, je peux poster des informations supplémentaires là-bas si quelqu'un veut voir si ce bloc peut être retiré, mais je ne suis pas inquiet ... Je pourrais l'examiner plus tard.

Était-ce utile?

La solution

Avez-vous fait des progrès sur ce problème? Il pourrait être utile si vous pouvez mettre à jour votre question avec votre comportement attendu et ce que le code est en train de faire? Comme nous l'avons déjà souligné, JFrame est une sous-classe de fenêtre, donc si vous avez un JFrame, vous n'avez pas besoin d'une fenêtre.

Pour ce que ça vaut, j'ai une application Java qui fonctionne en mode plein écran. Bien que l'écran ne soit pas repeint aussi souvent que le vôtre, il est repeint régulièrement. Je fais ce qui suit pour entrer en plein écran:

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

Alors chaque fois que je dois mettre à jour l'écran, je viens de brancher un nouveau JPanel dans les 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();

ne peut prétendre que c'est techniquement parfait, mais il fonctionne bien pour moi. Si les exemples pseudo-code ne coupe pas, je peux passer un peu de temps mettre sur pied un exemple compilable.

Autres conseils

JPanel n'est pas une sous-classe de fenêtre . JFrame est.

Vous pouvez essayer:

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

appyYourFullScreenCodeFor( yourFrame );

Cela devrait fonctionner.

Je pense que je suis ce que vous avez besoin.

  1. Définir le cadre undecorated, il     vient sans barre de titre et     choses.

  2. Ajoutez votre panneau au châssis., Il ressemble que votre panneau est affiché.

  3. Optimisez votre cadre. Alors maintenant devrait ressembler il n'y a que votre panneau plein écran en prenant sans et d'autres choses de la fenêtre.

      

    frame.setUndecorated (true);   frame.add (panel); // maximiser maintenant votre   cadre.

Remarque . Il est important de noter que l'API undecorated ne peut être appelée lorsque votre image est affichable, donc si son spectacle déjà, vous devez d'abord faire setVisible (false)

EDIT1 : Si vous voulez simplement obtenir la fenêtre contenant votre panneau, vous pouvez le faire:

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

Une fois que vous obtenez l'instance de fenêtre, vous pouvez passer partout où vous voulez.

EDIT2 : Aussi la classe Frame étend Window de sorte que vous pouvez directement faire gs.setFullScreen(frame). Vous ne avez pas besoin de créer une nouvelle fenêtre pour cette image.

  

Ma compréhension de JPanel est que   est une fenêtre sorte

Pourquoi pensez-vous que? Avez-vous lu l'API? Est-ce que JPanel étendre de la fenêtre?

Vous pouvez essayer d'utiliser la classe SwingUtilities. Il a une méthode qui retourne la fenêtre pour un composant donné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top