Tworzenie okna pełnoekranowego

0

Kod, z którego korzystam:

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

public class FullScreenTest extends JFrame
{
	public static void main(String[] args)
	{
		DisplayMode displayMode;
		
		if (args.lenght == 3)
		{
			displayMode = new DisplayMode(
			Integer.parseInt(args[0]),
			Integer.parseInt(args[1]),
			Integer.parseInt(args[2]),
			DisplayMode.REFRESH_RATE_UNKOWN);
		}
		else
		{
			displayMode = new DisplayMode(1600, 900, 24, DisplayMode.REFRESH_RATE_UNKOWN);
		}
	
		FullScreenTest test = new FullScreenTest();
		test.run(displayMode);
	}
	
	private static final long DEMO_TIME = 5000;
	
	public void run(DisplayMode displayMode)
	{
		setBackground(Color.blue);
		setForeground(Color.white);
		setFont(newFont("Dialog", 0, 24));
		
		SimpleScreenManager screen = new SimpleScreenManager();
		try
		{
			screen.setFullScreen(displayMode, this);
			try
			{
				Thread.sleep(DEMO_TIME);
			}
			catch (InterruptedException ex) { }
		}
		finally
		{
			screen.restoreScreen();
		}
	}
	
	public void paint(Graphics g)
	{
		g.drawString("Hello, world!", 20, 50);
	}
}

class SimpleScreenManager
{
	private GraphicsDevice device;
	
	public SimpleScreenManager()
	{
		GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
		device = environment.getDefaultScreenDevice();
	}
	
	public void setFullScreen(DisplayMode displayMode, JFrame window)
	{
		window.setUndecorated(true);
		window.setResizable(false);
		device.setFullScreenWindow(window);
		if (displayMode != null && device.isDisplayChangeSupported())
		{
			try
			{
				device.setDisplayMode(displayMode);
			}
			catch (IllegalArgumentException ex)
			{
				//ignorowanie
			}
		}
	}
	
	public Window getFullScreenWindow()
	{
		return device.getFullScreenWindow();
	}
	
	public void restoreScreen()
	{
		Window window = device.getFullScreenWindow();
		if (window != null)
		{
			window.dispose();
		}
		device.setFullScreenWindow(null);
	}
}

Co tu nie działa? Uczę się z książki "Java. Tworzenie gier" wydawnictwa Helion, na początku chciałem przerobić nieco kod, ale teraz jest on idealną kopią kodu z książki. Powinien on włączyć okno w trybie pełnoekranowym, wyświetlić napis "Hello, world!", a następnie po 5 sekundach zamknąć okno. Kompilator wywala takie błędy:

C:\Users\Norbert\Desktop\Inne\Programowanie\5z\work1>javac FullScreenTest.java
FullScreenTest.java:29: cannot resolve symbol
symbol  : class DisplayMode
location: class FullScreenTest
        public void run(DisplayMode displayMode)
                        ^
FullScreenTest.java:67: cannot resolve symbol
symbol  : class DisplayMode
location: class SimpleScreenManager
        public void setFullScreen(DisplayMode displayMode, JFrame window)
                                  ^
FullScreenTest.java:8: cannot resolve symbol
symbol  : class DisplayMode
location: class FullScreenTest
                DisplayMode displayMode;
                ^
FullScreenTest.java:10: cannot resolve symbol
symbol  : variable lenght
location: class java.lang.String[]
                if (args.lenght == 3)
                        ^
FullScreenTest.java:12: cannot resolve symbol
symbol  : class DisplayMode
location: class FullScreenTest
                        displayMode = new DisplayMode(
                                          ^
FullScreenTest.java:16: cannot resolve symbol
symbol  : variable DisplayMode
location: class FullScreenTest
                        DisplayMode.REFRESH_RATE_UNKOWN);
                        ^
FullScreenTest.java:20: cannot resolve symbol
symbol  : class DisplayMode
location: class FullScreenTest
                        displayMode = new DisplayMode(1600, 900, 24, DisplayMode
.REFRESH_RATE_UNKOWN);
                                          ^
FullScreenTest.java:20: cannot resolve symbol
symbol  : variable DisplayMode
location: class FullScreenTest
                        displayMode = new DisplayMode(1600, 900, 24, DisplayMode
.REFRESH_RATE_UNKOWN);
                                                                     ^
FullScreenTest.java:33: cannot resolve symbol
symbol  : method newFont  (java.lang.String,int,int)
location: class FullScreenTest
                setFont(newFont("Dialog", 0, 24));
                        ^
FullScreenTest.java:69: cannot resolve symbol
symbol  : method setUndecorated  (boolean)
location: class javax.swing.JFrame
                window.setUndecorated(true);
                      ^
FullScreenTest.java:71: cannot resolve symbol
symbol  : method setFullScreenWindow  (javax.swing.JFrame)
location: class java.awt.GraphicsDevice
                device.setFullScreenWindow(window);
                      ^
FullScreenTest.java:72: cannot resolve symbol
symbol  : method isDisplayChangeSupported  ()
location: class java.awt.GraphicsDevice
                if (displayMode != null && device.isDisplayChangeSupported())
                                                 ^
FullScreenTest.java:87: cannot resolve symbol
symbol  : method getFullScreenWindow  ()
location: class java.awt.GraphicsDevice
                return device.getFullScreenWindow();
                             ^
FullScreenTest.java:92: cannot resolve symbol
symbol  : method getFullScreenWindow  ()
location: class java.awt.GraphicsDevice
                Window window = device.getFullScreenWindow();
                                      ^
FullScreenTest.java:97: cannot resolve symbol
symbol  : method setFullScreenWindow  (<null>)
location: class java.awt.GraphicsDevice
                device.setFullScreenWindow(null);
                      ^
15 errors
0

Jaką masz wersję kompilatora?

0

Kod piszę w Notepadzie++, kod kompiluję przez standardowy kompilator Windowsa (ten czarny z białymi napisami), jego wersja to 6.1.7601. Zainstalowałem poprawnie JDK, bo prostsze kody działają poprawnie.

0

Piszesz lodówką? Brakuje ci importów. Zrób "fix imports"...

edit: to przestań pisać notatnikiem, bo notatnik jest do NOTOWANIA a nie do programowania. Jak używasz jakichś klas to musisz je zaimportować!

0

Notepad++ dość mi napsuł życia, skopiowałem cały kod do NetBeans 7.1.2 i zacząłem poprawiać błędy, jednak zostało mi jeszcze kilka w klasie FullScreenTest:

displayMode = new DisplayMode(
			Integer.parseInt(args[0]),
			Integer.parseInt(args[1]),
			Integer.parseInt(args[2]),
			DisplayMode.REFRESH_RATE_UNKOWN);

Wyświetla: internal error; cannot instantiate DisplayMode(int, int, int, int) at java.awt.DisplayMode to ()
W ostatniej linijce jest dodatkowo cannot find symbol: variable REFRESH_RATE_UNKOWN location: class java.awt.DisplayMode

displayMode = new DisplayMode(1600, 900, 24, DisplayMode.REFRESH_RATE_UNKOWN);

Te same dwa błędy, co wyżej

setFont(newFont("Dialog", 0, 24));

cannot find symbol: method newFont(java.lang.String,int,int)
location: class FullScreenTest

Rozumiem, co oznaczają błędy, ale jak je naprawić - oto jest pytanie.

0

Autor, kod musisz przepisać bez błędów, (albo zmienić podręcznik). length, a nie lenght.

0

tak, wiem, to ostatnie już poprawiłem (źle przepisałem). Błędy są jednak bez zmian.

WSZYSTKO JUŻ DZIAŁA. Przeczytałem jeszcze raz cały rozdział, i wynikło z niego, że

displayMode = new DisplayMode (x, y, r, h)

ustala:
x, y - rozdzielczość ekranu
r - głębia kolorów
h - częstotliwość odświeżania w Hz
W miejscu h usunąłem "DisplayMode.REFRESH_RATE_UNKOWN" i wstawiłem optymalną dla ludzkiego oka częstotliwość 75 i wszystko działa poprawnie. Gdybym miał jeszcze jakiś problem, będę pisał.

0

UNKNOWN

0

nie @norbi452, musisz nauczyć się używać narzędzi do programowania. Eclipse (i Netbeans pewnie też) ma takie coś jak podpowiadanie składni (ctrl+spacja) oraz proponowanie jak naprawić kod (ctrl+1)

0

Pewna zagadka jednak została niewyjaśniona:

import java.awt.*;
import javax.swing.JFrame;
 
public class FullScreenTest extends JFrame
{
        public static void main(String[] args)
        {
                DisplayMode displayMode; // to jest ósmy wiersz

Jeden z komunikatów kompilatora:

FullScreenTest.java:8: cannot resolve symbol
symbol  : class DisplayMode
location: class FullScreenTest
                DisplayMode displayMode;

1 użytkowników online, w tym zalogowanych: 0, gości: 1