Frage

Einfach gesagt, ich versuche ein Spiel zu machen, an dem ich arbeite, an dem ich arbeite.

Ich habe den folgenden Code, den ich verwenden möchte:

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

Das Problem dabei ist, dass ich innerhalb einer Klasse arbeite, die JPanel erweitert, und obwohl ich eine Variable des Typs -Rahmens habe, habe ich keines Fenster in der Klasse.

Mein Verständnis von JPanel ist, dass es sich um eine Art Fenster handelt, aber ich kann 'das' in gs.setfullscreenWindow (Fenstergewinn) nicht übergeben ... wie soll ich das machen?

Gibt es eine einfache Möglichkeit, diese oder eine ähnliche Methode mit einem JPanel zu bezeichnen?

Gibt es eine Möglichkeit, wie ich etwas vom Typ Fenster von meinem JPanel bekommen kann?

-

Bearbeiten: Die folgende Methode ändert den Status von JFRame und wird alle 10 ms bezeichnet:

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

Ich gehe davon aus, dass es möglicherweise einige Entlassungen oder unnötige Anrufe nach der Erklärung if (g == null) (alle Rahmen.Somethethingother () s) geben, jeder Aufräumarbeiten würde geschätzt ...

Außerdem ist der Blockfehler, wie es scheint. Ich ignoriere einen Fehler. Der Fehler tritt nur einmal auf, und dies funktioniert gut, wenn Sie die erste Instanz des Fehlers ignorieren ... Für alle Interessierten kann ich dort zusätzliche Informationen veröffentlichen, wenn jemand sehen möchte, ob dieser Block entfernt werden kann, aber ich bin nicht besorgt ... Ich könnte es später untersuchen.

War es hilfreich?

Lösung

Haben Sie bei diesem Problem Fortschritte gemacht? Es könnte hilfreich sein, wenn Sie Ihre Frage mit Ihrem erwarteten Verhalten aktualisieren könnten und was der Code tatsächlich tut? Wie bereits erwähnt, ist JFrame eine Unterklasse des Fensters. Wenn Sie also einen JFRame haben, benötigen Sie kein Fenster.

Für das, was es wert ist, habe ich eine Java -App, die im Vollbildmodus funktioniert. Obwohl der Bildschirm nicht so oft neu gestrichen wird wie deins, wird er regelmäßig neu gestrichen. Ich mache Folgendes, um das Vollbild zu betreten:

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

Wann immer ich den Bildschirm aktualisieren muss, schließe ich einfach ein neues JPanel in die 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();

Ich kann nicht behaupten, dass es technisch perfekt ist, aber es funktioniert gut für mich. Wenn die Pseudo-Code-Beispiele es nicht schneiden, kann ich einige Zeit damit verbringen, ein kompilierbares Beispiel zusammenzustellen.

Andere Tipps

Jpanel ist keine Unterklasse von Fenster. JFrame ist.

Sie könnten also versuchen:

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

appyYourFullScreenCodeFor( yourFrame );

Das sollte funktionieren.

Ich glaube, ich habe was du brauchst.

  1. Setzen Sie den Frame nicht dekoriert, so dass er ohne Titelleiste und Sachen kommt.

  2. Fügen Sie Ihr Panel dem Rahmen hinzu. Es sieht also so aus, als ob nur Ihr Panel angezeigt wird.

  3. Maximieren Sie Ihren Rahmen. Jetzt sollte es also so aussehen, als ob nur Ihr Panel den Vollbildmodus ohne Fenster und Fenstermaterial nimmt.

    Frame.SetUntecorated (true); Frame.Add (Panel); // maximiere nun deinen Rahmen.

Notiz: Es ist wichtig zu beachten, dass die nicht dekorierte API nur dann aufgerufen werden kann, wenn Ihr Rahmen nicht issplaybar ist. Wenn sie also bereits angezeigt wird, müssen Sie zuerst setvisible (falsch) tun.

Edit1: Wenn Sie nur das Fenster mit Ihrem Panel erhalten möchten, können Sie dies tun:

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

Sobald Sie die Fensterinstanz erhalten haben, können Sie sie überall übergeben, wo Sie möchten.

Edit2: Auch die Frame Klasse erstreckt sich Window So können Sie direkt tun gs.setFullScreen(frame). Sie müssen kein neues Fenster für diesen Frame erstellen.

Mein Verständnis von JPanel ist, dass es sich um eine Art Fenster handelt

Warum denkst du das? Hast du die API gelesen? Erstreckt sich jpanel vom Fenster?

Sie können versuchen, die Swingutilities -Klasse zu verwenden. Es hat eine Methode, die das Fenster für eine bestimmte Komponente zurückgibt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top