In JAVA, changing resolution with setDisplayMode f

2019-01-20 06:48发布

问题:

I am a beginner int the JAVA language and is trying to learn how to create full screen applications.

I am trying to create a simple application where when run, displays a full screen with blue back ground and a simple line of text in the center of the screen( it starts at position 400x300). The resolution of the application is set to 800x600.

I am running the code on a MacbookAir, running OSX Lion, with a screen resolution of 1440x900. The problem is, despite getting a blue background as I had expected, the text only appears on around upper left of the screen. The position of the text would continue to move down and right as I increase it's position until it reaches beyond 1440x900 when it disappears. I am guessing that the screen resolution is still set at 1440x900 as oppose to 800x600.

Here are my main class:

import java.awt.*;
import javax.swing.JFrame;

public class bucky extends JFrame {
    public static void main(String[] args){

        DisplayMode dm = new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN);
        bucky b = new bucky();
        b.run(dm);
    }

    public void run(DisplayMode dm){
        setBackground(Color.BLUE); // Setting background color
        setForeground(Color.WHITE);
        setFont(new Font("Arial", Font.PLAIN, 24));

        //The Screen variable is going to be a screen object
        Screen s = new Screen();
        try{
            s.setFullScreen(dm, this); //this refers to whatever object we are working on, ie 's'
            try{
                //Once it is set to full screen, and wait for 5 second
                Thread.sleep(5000);
            }catch(Exception ex){};
        }
        finally{
            s.restoreScreen();
        }
    }

    public void paint(Graphics g){
        g.drawString("Test", 400, 300);
    }

}

And here is the the constructor for the Screen class and method from Screen class which sets the application to full screen

private GraphicsDevice vc; // Gives an interface to graphics card/video card.

public Screen(){
    //env is environment variable, containing all graphics manipulation objects
    GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();

    //When we get environment and getDegaultScreen Device, we get access to the entire monitor, not just a window
    vc = env.getDefaultScreenDevice();

}

public void setFullScreen(DisplayMode dm, JFrame window){ 

        window.setUndecorated(true); 
        window.setResizable(false); 
        vc.setFullScreenWindow(window); 


        if(dm != null && vc.isDisplayChangeSupported()) {
            try{
                vc.setDisplayMode(dm); 
            }catch(Exception ex){}
        }

    }

If anyone could point me out to why the resolution is not being set properly, it would be much appreciated.

回答1:

From the docs for setDisplayMode

The display mode must be one of the display modes returned by getDisplayModes(), with one exception: passing a display mode with DisplayMode.REFRESH_RATE_UNKNOWN refresh rate will result in selecting a display mode from the list of available display modes with matching width, height and bit depth.

So you'll need to make sure that you set the display mode to one of those.



回答2:

I think that the answer is in javadoc of GraphicsDevice.setDisplayMode(...). You should first check if (gd.isFullScreenSupported()) and then call setFullScreenWindow(frame) or else simulate the fullscreen mode using frame.setSize(...) method.