views:

189

answers:

2

My weird monitor's native resolution isn't recognized by Windows, so I have to set a custom resolution for it. The problem is that java doesn't recognize it since it's not on Win7's "approved" list, so full-screen mode gets "stuck". Netbeans comes out of full-screen fine, so there has to be a way around this. Anyone know it?

//Edit (3/29/2010): It looks like NetBeans is faking fullscreen rather than actually going into Full-Screen Exclusive mode, so this may not actually be solvable. For now, I'm also faking it. Seems like java ought to recognize the active DisplayMode as valid, though.

This example reproduces the issue:


package resolutionexample;

import java.awt.Dimension;
import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
                GraphicsDevice gd = ge.getDefaultScreenDevice();

                DisplayMode currentDM = gd.getDisplayMode();

                boolean currentInAvailable = false;

                System.out.println("Available resolutions:");
                for ( DisplayMode availDM : gd.getDisplayModes() ){
                    //System.out.println(availDM.getWidth() + "x" + availDM.getHeight());
                    if ( availDM.equals(currentDM) ){
                        currentInAvailable = true;
                    }
                }

                System.out.println("Current resolution: " + currentDM.getWidth() + "x" + currentDM.getHeight() );

                System.out.println("Current in available: " + currentInAvailable);


                JFrame frame = new JFrame("Resolution Bug Example");
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                if ( !gd.isFullScreenSupported() ){System.exit(0);}

                gd.setFullScreenWindow(frame);

                gd.setFullScreenWindow(null);
            }
        });
    }
}

Output running 1680x1050 (the monitor's wonky native resolution):


run:
Available resolutions:
Current resolution: 1680x1050
Current in available: false
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Invalid display mode
        at sun.awt.Win32GraphicsDevice.setDisplayMode(Win32GraphicsDevice.java:393)
        at sun.awt.Win32GraphicsDevice.setFullScreenWindow(Win32GraphicsDevice.java:329)
        at resolutionexample.Main$1.run(Main.java:43)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
BUILD SUCCESSFUL (total time: 2 seconds)

Output if I set my resolution to 1024x768 before running:


run:
Available resolutions:
Current resolution: 1024x768
Current in available: true
BUILD SUCCESSFUL (total time: 2 seconds)
+1  A: 

What do you mean with stuck? Not a good resolution or no real fullscreen mode? For a big screen you could try

Rectangle rect = GraphicsEnvironment.getLocalGraphicsEnvironment().
                 getMaximumWindowBounds();
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(rect.width, rect.height));

For the fullscreen toggle you could simply copy the sources from netbeans' MainWindow :-)

Karussell
It goes into real fullscreen, but it won't come out of it, nor will it respond to alt-tab while it's stuck.For now, I am indeed using a fake fullscreen similar to the one you describe. :)
Angie
+1  A: 

How about adding the resolution to Windows 7?

I did this once with PowerStrip (http://entechtaiwan.com/util/ps.shtm.) but that was for XP .

Frank Meulenaar
I could probably get that to work for my PC, but I'd hate to have to explain that to my eventual end-users ;)
Angie