Frage

Ich habe ein Problem, die Java -Anwendung im Vollbildmodus auf "OpenSuse 11.4 (x86_64)" auszuführen. Ich verwende Java 1.6.0_26-B03.

Ich habe versucht, zwei Beispiele für die Vollbildungsanwendung auszuführen:

  1. Beispiel von Oracle Site: Anzeigemodus -Test.
  2. Jdarkroom.jar (einfacher Texteditor) heruntergeladen von Codalchemisten.

In beiden Fällen habe ich eine Linux -Taskleiste, die über der Anwendung sichtbar ist. Es muss etwas mit Systemeinstellungen/Konfiguration sein?

War es hilfreich?

Lösung

Du sollte in der Lage sein, mit „wirklich Vollbild“ zu gehen GraphicsDevice.setFullScreenWindow (window). Aufgrund von Fehlern in den beliebtesten Java -Laufzeiten funktioniert dies jedoch möglicherweise nicht auf Systemen, die bestimmte „kaputte“ Versionen in der 1.6 = Java 6 -Serie ausführen. Ich habe das nicht gründlich getestet, daher kann es sein, dass sich der Patch noch nicht in die allgemeine Bevölkerung ausbreitete.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7057287

Hintergrund/Theorie

Ok, hier gilt für zu viele Informationen und nicht genug Hilfe ... hier ist ein bisschen warum Das funktionierte nicht richtig ...

Es gibt keinen Linux -Desktop

Linux-basierte Betriebssysteme auf PC-Maschinen sowie andere Einheiten (mit einer teilweisen Ausnahme für macOSX) verwenden normalerweise das X-Fenstersystem (auch bekannt als X11). Unter X haben Sie einen X -Server (normalerweise etwas wie ein „Videotreiber“) und Kunden Das verbinden sich meistens von derselben Maschine (Loopback).

Das Layout und die Platzierung von Fenstern werden von a gesteuert Besondere Kundenprogramm, genannt Window Manager. Es ist verantwortlich für die Dekoration der Fenster (zB Zeichentitelbalken oder Größengrößengriffe) und die Positionierung.

Ihr Programm wäre ein X -Client. Es kann Anfrage - aber nicht fordern - Platzierung auf dem Bildschirm an einer bestimmten Position oder einer bestimmten Größe. Verschiedene Fenstermanager sind mehr (oder weniger) anfällig dafür, Ihnen das zu geben, was Sie wollen.

Außer dass die meisten Desktops gut spielen (manchmal)

Jetzt verwenden die meisten Linux -Desktops bei weitem den Gnome -Desktop mit einem starken zweiten Platz für den K -Desktop, und einige andere sind in ziemlich breitem Gebrauch. Was „nett“ ist, ist, dass diese beiden Desktopumgebungen (sowie einige andere, wie XFCE für Low-End-PCs) an das entsprechen Freedesktop.org Fenstermanager Hinweise Standards.

(Super-Over-Simplifikation :) In der Regel gibt es Panels an einer oder mehreren Kanten des Bildschirms. Normalerweise gibt es nur einen, aber es gibt, aber es gibt viele Variationen. Diese Panelbereiche gelten nicht als „Teil des Bildschirms“, daher teilt der Fenstermanager Ihrer Bewerbung mit: „Nein, das liegt außerhalb des Bereichs, in dem Sie spielen dürfen. Dieser Bildschirm ist nicht 1920 × 1080, sondern nur 1890 × 1080. “ Das könnte natürlich eine völlig andere Arrangement sein als das, was Sie beim Schreiben Ihrer App erwartet hatten, und Sie sind möglicherweise in meinem Netbook mit einem physischen Bildschirm von 800 × 480, der vorgibt, nur 780 × 480 zu sein.

Für 99% der Apps ist das großartig. Die Fenster werden den Panels nicht im Wege stehen, sodass Sie das Panel immer für kritische Steuerelemente erreichen können, z.

Mit diesen „Hinweisen“ können Sie anfordern, dass Ihre Fenster auf höchstem Niveau speziell behandelt werden. Sie können beispielsweise anfordern, dass Sie keine Titelleiste erhalten - oder eine reduzierte Titelleiste vom Typ "Palette". Sie können anfordern, in der Fensterliste, der Aufgabenleiste oder der Aktivitätenübersicht oder der anderen Schnittstelle übersprungen zu werden, um die aktiven Fenster anzuzeigen. Oder Sie können beantragen zu gehen Ja wirklich Vollbild und alles andere aus dem Weg drücken, sogar Panels.

Die Spezifikation ist hier: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html

Und der Fehler:

Grundsätzlich wurde die Spezifikation des Fenstermanagers von Sun/Oracle (oder Red Hat, der von Sun/Orakel kopiert, oder wahrscheinlich IBM, nicht richtig befolgt, weil sie wahrscheinlich dasselbe getan haben, aber ich sehe niemanden, der sich über sie beschwert, )…

Ich sehe zwar etwas hin und her, ob es sich (speziell) mit dem Fenstermanager der K Desktop -Umgebung (KWIN) (speziell) als Fehler handelt, als offenbar Dieser Fehler taucht nur in k auf, und nicht in Gnome, XFCE und Freunden.

Arbeit

Abgesehen vom Patch Ihrer Java-Laufzeiten (und/oder der Ihrer Kunden) ist die einzige wirkliche Lösung, die plattformspezifischen Java-Bibliotheken zu verwenden (vielleicht die zugrunde liegenden AWT-Objekte mit Reflexion… eww…) und die richtigen Fenster Hinweise festlegen, selbst selbst, selbst selbst, selbst selbst, selbst selbst .

Ja, das ist eklig ...

Andere Tipps

Nur eine Präzision auf die Methode von BGROENKS:
Es funktioniert gut mit Java7 und Java8 auf Ubuntu 14.10 (Einheit).

Aber: Sie müssen setzen frame.setResizable(true); Ansonsten wird es nicht funktionieren.

Seien Sie vorsichtig: Der Vollbildmodus funktioniert nur mit JFrame (kein JDialog oder JWindow).

Hier ein Beispielcode: Es findet statt setVisible(true)

/**
 * @param frame
 * @param doPack
 * @return device.isFullScreenSupported
 */
static public boolean fullScreen(final JFrame frame, boolean doPack) {

    GraphicsDevice device = frame.getGraphicsConfiguration().getDevice();
    boolean result = device.isFullScreenSupported();

    if (result) {
        frame.setUndecorated(true);
        frame.setResizable(true);

        frame.addFocusListener(new FocusListener() {

            @Override
            public void focusGained(FocusEvent arg0) {
                frame.setAlwaysOnTop(true);
            }

            @Override
            public void focusLost(FocusEvent arg0) {
                frame.setAlwaysOnTop(false);
            }
        });

        if (doPack)
            frame.pack();

        device.setFullScreenWindow(frame);
    }
    else {
        frame.setPreferredSize(frame.getGraphicsConfiguration().getBounds().getSize());

        if (doPack)
            frame.pack();

        frame.setResizable(true);

        frame.setExtendedState(Frame.MAXIMIZED_BOTH);
        boolean successful = frame.getExtendedState() == Frame.MAXIMIZED_BOTH;

        frame.setVisible(true);

        if (!successful)
            frame.setExtendedState(Frame.MAXIMIZED_BOTH);
    }
    return result;
}

Grüße, Stéphane.

Mir ist klar, dass diese Frage ein bisschen alt ist, aber ich bin darauf gestoßen, dass sie nach der gleichen Antwort gesucht habe.

Nach viel Experimentieren hatte ich eine gute Lösung:

GraphicsDevice d = GraphicsEnvironment
    .getLocalGraphicsEnvironment().getDefaultScreenDevice();
if (d.isFullScreenSupported()) {
    frame.setUndecorated(true);
    frame.setResizable(false);
    frame.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent arg0) {
            frame.setAlwaysOnTop(true);
        }

        @Override
        public void focusLost(FocusEvent arg0) {
            frame.setAlwaysOnTop(false);
        }
    });
    d.setFullScreenWindow(frame);
} else {
    frame.setVisible(true);
}

Der Focus-Hörer ist so, dass der Benutzer Alt-Tab oder Meta-D aus dem Fenster heraus kann, ohne dass er sofort Refokus erzwingt.

Dies funktioniert auf meinem Linux Mint 15-System mit KDE 4. Ich verwende auch einen Nvidia X-Server.

Hoffe das hilft! Lassen Sie mich wissen, ob es auch für euch funktioniert!

Keiner der oben genannten hat für mich funktioniert, ich benutze Xubuntu, aber ich habe gerade versucht, ein JWindow anstelle eines JFrame zu verwenden, und es hat funktioniert! Das war so frustrierend, hoffentlich funktioniert es für Sie. Oh, ich sollte erwähnen, dass ich mich die API noch nicht angesehen habe und ich bin mit der JWindow -Klasse wirklich nicht vertraut, daher bin ich mir nicht sicher, was die Unterschiede zwischen einem JWindow und einem JFRame sind. Viel Glück.

Ich habe Oracle Java Editions 1.6.0_31 und 1.6.0_26 im Vollbildmodus verwendet. Ich habe einige der Probleme mit dem Fenster erlebt, das nicht über der Taskleiste in Ubuntu angezeigt wurde. Ich konnte es jedoch mit diesem kleinen Code -Beispiel funktionieren.

// Create a window for full-screen mode; add a button to leave full-screen mode
GraphicsDevice gs = GraphicsEnvironment.getLocalGraphicsEnvironment().
                    getDefaultScreenDevice(); 
                    //or initialize this for a specific display
Frame frame = new Frame(gs.getDefaultConfiguration());
Window win = new Window(frame);
Canvas c = new Canvas();
c.setBackground(Color.RED);
win.add(c);
win.show();  //or setVisible(true);

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

Der Trick, der funktioniert hat, besteht darin, zuerst das Fenster sichtbar zu machen und das Fenster dann im Vollbildmodus zu platzieren. Das Einstellen des Vollbildmodus, bevor er angezeigt wird, führte zu der Aufgabenleiste über dem Fenster.

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