AWT Full-Screen Exclusive Mode

G

Guest2

Gast
Moin,

ich habe einen Anwendungsfall, bei dem ich im laufenden Betrieb nahtlos zwischen Fenster- und FSEM umschalten möchte. Mit reinem Swing stellt das auch kein Problem dar. Allerdings verwendet diese Anwendung eine AWT heavy weight Komponente. Sobald diese eingebunden ist, beleibt die gesamte Anwendung im FSEM schwarz.

Alternativ kann ich den gesamten Anwendungsfall aber auch mit reinem AWT abdecken, allerdings beleibt das Problem dabei bestehen. Ein schnell zusammengeschriebenes KSKB:

Java:
package fsem;

import java.awt.Choice;

public class FSEM {

    private final GraphicsDevice           device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
    private final Map<String, DisplayMode> modes  = displayModesToHashMap(device.getDisplayModes(), device.getDisplayMode());
    private final DisplayMode              mode   = device.getDisplayMode();

    private Frame                          frame;
    private Choice                         choice;


    public FSEM() {

        initialize();

    }


    private void initialize() {

        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setLocationRelativeTo(null);

        choice = new Choice();

        for (final String key : modes.keySet())
            choice.add(key);

        choice.select("Window");

        choice.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(final ItemEvent e) {

                if (e.getStateChange() == ItemEvent.SELECTED)
                    setDisplayMode((String) e.getItemSelectable().getSelectedObjects()[0]);

            }
        });

        frame.add(choice);

    }


    private void setDisplayMode(final String key) {

        final DisplayMode dm = modes.get(key);

        if (dm != null)
            setFullScreenMode(dm);

        else
            setWindowMode();

    }


    private void setFullScreenMode(final DisplayMode dm) {

        try {

            frame.setVisible(false);
            frame.dispose();
            frame.setUndecorated(true);
            frame.setResizable(false);
            frame.setSize(dm.getWidth(), dm.getHeight());
            frame.pack();
            frame.setVisible(true);

            device.setFullScreenWindow(frame);
            device.setDisplayMode(dm);

        } catch (final Exception e) {

            e.printStackTrace();

            setWindowMode();

        }

    }


    private void setWindowMode() {

        device.setDisplayMode(mode);
        device.setFullScreenWindow(null);

        frame.setVisible(false);
        frame.dispose();
        frame.setUndecorated(false);
        frame.setResizable(true);
        frame.setSize(mode.getWidth() / 2, mode.getHeight() / 2);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);

    }


    private Map<String, DisplayMode> displayModesToHashMap(final DisplayMode[] modes, final DisplayMode current) {

        final Map<String, DisplayMode> result = new TreeMap<String, DisplayMode>();

        result.put("Window", null);

        for (final DisplayMode mode : modes)
            if (mode.getRefreshRate() == current.getRefreshRate() && mode.getBitDepth() == current.getBitDepth()) {

                final String key = mode.getWidth() + "x" + mode.getHeight();
                final DisplayMode value = mode;

                result.put(key, value);

            }

        return result;

    }


    public static void main(final String[] args) {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {

                try {

                    final FSEM window = new FSEM();
                    window.frame.setVisible(true);

                } catch (final Exception e) {

                    e.printStackTrace();

                }

            }

        });

    }

}

Der Monitor schaltet dabei auf die korrekte Auflösung um und in der Windows Vorschau sieht man auch das das Frame korrekt dargestellt wird. Im FSEM bleibt jedoch alles schwarz (außer dem Mauszeiger). Dasselbe Beispiel in Swing funktioniert problemlos.

Hat vielleicht jemand eine Idee was ich vergessen habe?

Viele Grüße,
Fancy
 

Michael...

Top Contributor
Ich ahne zwar die Antwort, aber trotzdem: Um was für eine AWT Komponente handelt es sich? Kann man diese nicht durch eine Swing Komponente ersetzen?
 
G

Guest2

Gast
Technisch ist das lediglich ein AWT Canvas, auf dem allerdings einige native Funktionen aufgerufen werden (es ist ähnlich zum z.B. GLCanvas aus jogl). Wie schon vermutet, geht ein ersetzen mit einer Swing Komponente daher leider nicht.

Die Swing Version scheitert auch schon sobald irgendeine andere AWT Komponente verwendet wird, es liegt also leider auch nicht an meiner speziellen AWT Komponente.

Viele Grüße,
Fancy
 
G

Guest2

Gast
Ok, zumindest lässt sich das Problem mit -Dsun.java2d.d3d=false umgehen. Dann geht bei mir sowohl die reine AWT Lösung als auch die Swing/AWT Version. Ist zwar nicht schön, aber immerhin geht’s und ich weis nun das meine AWT Komponente soweit in Ordnung ist.

Quelle, Bug report

Viele Grüße,
Fancy
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Screen nur 1x öffnen können AWT, Swing, JavaFX & SWT 17
M Loading Screen anzeigen bei Black Screen AWT, Swing, JavaFX & SWT 1
Danloc Swing Splash Screen Prozentanzeige AWT, Swing, JavaFX & SWT 4
S 3D-Grafik Marker zu aus Screen anvisiertem Object AWT, Swing, JavaFX & SWT 1
Hijo2006 Splash-Screen AWT, Swing, JavaFX & SWT 2
stylegangsta Splash Screen erscheint nicht AWT, Swing, JavaFX & SWT 30
J 2D-Grafik Windows Blue-Screen nach anzeigen eines Bildes in Java AWT, Swing, JavaFX & SWT 10
F GWT Screen size AWT, Swing, JavaFX & SWT 2
E Swing Grundlegendes Vorhehen. Login-Screen, danach Arbeits-Screen AWT, Swing, JavaFX & SWT 4
R MouseEvent.getX() liefert in Applet Screen-Koordinate AWT, Swing, JavaFX & SWT 2
P Swing || AWT unschlüssig + Layoutfrage [m. Screen] AWT, Swing, JavaFX & SWT 16
J Screen Capture AWT, Swing, JavaFX & SWT 5
S Splash Screen / "Loading" Anzeige im Programm AWT, Swing, JavaFX & SWT 27
L Animierter Splash-Screen (mit NetBeans 6.1 z.B.) AWT, Swing, JavaFX & SWT 2
F splash screen mit progress bar - probleme mit invoke later AWT, Swing, JavaFX & SWT 7
H Transparente Splash-Screen AWT, Swing, JavaFX & SWT 5
I Splash Screen AWT, Swing, JavaFX & SWT 7
G Screen nach Auswahl schließen und neuen öffnen?wie mach ichs AWT, Swing, JavaFX & SWT 8
O der neue eclipse 3.1 splash screen AWT, Swing, JavaFX & SWT 3
G Splash Screen AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben