JFrames를 사용하는이 테스트 코드는 의도 한대로 작동합니다 (10 초 후에 닫힙니다).Windows를 사용할 때 회색 화면이 표시되지만 JFrame은 괜찮습니다.
// **** Imports ****
import java.awt.*;
import javax.swing.JFrame;
public class TestDisplay extends JFrame {
// **** Constructor ****
public static void main(String[] args)
{
DisplayMode dm =
new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN);
TestDisplay td = new TestDisplay();
td.run(dm);
}
// **** Methods ****
public void run(DisplayMode dm)
{
getContentPane().setBackground(Color.PINK);
setForeground(Color.WHITE);
setFont(new Font("Arial", Font.PLAIN, 24));
Screen s = new Screen();
try{
s.setFullScreen(dm, this);
try{
Thread.sleep(10000); // Delay before restoring screen (10 secs)
}catch(Exception ex){}
}finally{s.restoreScreen();}
}
public void paint(Graphics g) // JFrame calls paint method automatically
{
super.paint(g);
if(g instanceof Graphics2D)
{
System.out.println("It is Graphics2D");
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint // Turn on antialiasing for text
(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
}
g.drawString("This will be really cool", 200, 200);
}
}
그러나 Windows를 사용할 때 회색 화면 문제가 지속됩니다. TestDisplay> paint 메서드에서 "super.paint (g);"를 제거하면 같은 문제가 발생했습니다. 선. 다음은 정확하게 렌더링되지 않는 코드를 구성하는 블록이지만 올바르게 실행됩니다.
// **** Imports ****
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyTest extends Core implements KeyListener{
// **** Variables ****
private String mess = "";
// **** Constructor ****
public static void main(String[] args)
{
new KeyTest().run();
}
// **** Methods ****
//init also call init from superclass
public void init()
{
super.init();
Window w = s.getFullScreenWindow();
w.setFocusTraversalKeysEnabled(false); //make wierd buttons not wierd
w.addKeyListener(this);
mess = "Press escape to exit!";
}
//key pressed
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_ESCAPE)
{
stop();
}
else
{
mess = "Pressed : " + KeyEvent.getKeyText(keyCode);
e.consume(); //prevents button combinations (ex. alt + F = get file)
}
}
//key released
public void keyReleased(KeyEvent e)
{
int keyCode = e.getKeyCode();
mess = "Released : " + KeyEvent.getKeyText(keyCode);
e.consume(); //prevents button combinations (ex. alt + F = get file)
}
//last method from interface
public void keyTyped(KeyEvent e)
{
e.consume();
}
//draw
public synchronized void draw(Graphics2D g)
{
Window w = s.getFullScreenWindow();
g.setColor(w.getBackground());
g.fillRect(0, 0, s.getWidth(), s.getHeight());
g.drawString(mess, 30, 30);
}
}
코어 추상 클래스 :
// **** Imports ****
import java.awt.*;
import javax.swing.*;
public abstract class Core {
// **** Variables ****
private static final DisplayMode[] modes1 =
{
new DisplayMode(1920, 1080, 64, 0),
new DisplayMode(1920, 1080, 32, 0),
new DisplayMode(800, 600, 32, 0),
new DisplayMode(800, 600, 24, 0),
new DisplayMode(800, 600, 26, 0),
new DisplayMode(640, 480, 32, 0),
new DisplayMode(640, 480, 24, 0),
new DisplayMode(640, 480, 16, 0),
};
private boolean running;
protected ScreenManager s;
// **** Constructor ****
// **** Methods ****
//Stop method
public void stop()
{
running = false;
}
//call init and gameloop
public void run()
{
try{
init();
gameLoop();
}finally{s.restoreScreen();}
}
//set to full screen
public void init(){
s = new ScreenManager();
DisplayMode dm = s.findFirstCompatibleMode(modes1);
s.setFullScreen(dm);
Window w = s.getFullScreenWindow();
w.setFont(new Font("Arial", Font.PLAIN, 20));
w.setForeground(Color.RED);
w.setForeground(Color.WHITE);
running = true;
}
//main gameloop
public void gameLoop()
{
long startTime = System.currentTimeMillis();
long cTime = startTime;
while(running)
{
long timePassed = System.currentTimeMillis();
cTime = cTime + timePassed;
update(timePassed);
Graphics2D g = s.getGraphics();
draw(g);
g.dispose();
s.update();
try{
Thread.sleep(20);
}catch(Exception ex){}
}
}
//update animation
public void update(long timePassed){}
//draws to the screen
public abstract void draw(Graphics2D g);
}
을 ScreenManager 클래스 :
// **** Imports ****
import java.awt.*;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JFrame;
public class ScreenManager {
// **** Variables ****
private GraphicsDevice vc;
// **** Constructor ****
public ScreenManager()
{
//give vc access to monitor screen
GraphicsEnvironment e =
GraphicsEnvironment.getLocalGraphicsEnvironment();
vc = e.getDefaultScreenDevice();
}
// **** Methods ****
// ____ Handle Display Modes ____
//get all compatible display modes
public DisplayMode[] getCompatibleDiplayModes(){
return vc.getDisplayModes();
}
//compares display modes passed into vc and checks for a match
public DisplayMode findFirstCompatibleMode(DisplayMode modes[])
{
DisplayMode goodModes[] = vc.getDisplayModes();
for(int x=0; x<modes.length;x++)
{
for(int y=0;y<goodModes.length;y++)
{
if(displayModesMatch(modes[x], goodModes[y]))
{
return modes[x];
}
}
}
return null;
}
//get current display mode
public DisplayMode getCurrentDisplayMode()
{
return vc.getDisplayMode();
}
//check if two modes match
public boolean displayModesMatch(DisplayMode m1, DisplayMode m2)
{
//test if resolution match (if not match, false)
if(m1.getWidth() != m2.getWidth() || m1.getHeight() != m2.getHeight())
{
return false;
}
//test if bit depth match ((if not match, false)
if(m1.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI
&& m2.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI
&& m1.getBitDepth() != m2.getBitDepth())
{
return false;
}
//test if refresh rate match (if not match, false)
if(m1.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN
&& m2.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN
&& m1.getRefreshRate() != m2.getRefreshRate())
{
return false;
}
return true;
}
// ____ Handle Graphics ____
//make jframe full screen
public void setFullScreen(DisplayMode dm)
{
//Frame f = new Frame();
JFrame f = new JFrame();
f.setUndecorated(true);
f.setIgnoreRepaint(true);
f.setResizable(false);
vc.setFullScreenWindow(f);
if(dm != null && vc.isDisplayChangeSupported())
{
try{
vc.setDisplayMode(dm);
}catch(Exception ex){}
}
f.createBufferStrategy(2);
}
// ??? important magic ???
public Graphics2D getGraphics(){
Window w = vc.getFullScreenWindow();
if (w != null)
{
BufferStrategy s = w.getBufferStrategy();
return (Graphics2D)s.getDrawGraphics();
}
else
{
return null;
}
}
//updates display
public void update()
{
Window w = vc.getFullScreenWindow();
if(w != null)
{
BufferStrategy s = w.getBufferStrategy();
//only display new frame when it is ready
if(!s.contentsLost())
{
s.show();
}
}
}
//returns full screen window
public Window getFullScreenWindow()
{
return vc.getFullScreenWindow();
}
//get Width of window
public int getWidth()
{
Window w = vc.getFullScreenWindow();
if(w != null)
{
return w.getWidth();
}
else
{
return 0;
}
}
//get Height of window
public int getHeight()
{
Window w = vc.getFullScreenWindow();
if(w != null)
{
return w.getHeight();
}
else
{
return 0;
}
}
//get out of fullscreen
public void restoreScreen()
{
Window w = vc.getFullScreenWindow();
if (w != null)
{
w.dispose();
}
vc.setFullScreenWindow(null);
}
//create image compatible with monitor (width, height, transparency)
public BufferedImage createCompatibleImage(int w, int h, int t)
{
Window win = vc.getFullScreenWindow();
if(win != null)
{
GraphicsConfiguration gc = win.getGraphicsConfiguration();
return gc.createCompatibleImage(w, h, t);
}
return null;
}
}
나는 크게 감사하겠습니다 어떤 아이디어가 당신에게
KeyTest 클래스 (Esc 키를 눌러 창을 닫습니다) 사람들은 이것에 대해 해결할 수 있습니다.
코드를 중요한 부분으로 줄이실 수 있습니까? 그러나 일반적으로 SWING을 AWT와 병합하는 것은 좋지 않습니다. 너무 많은 다른 문제를 야기 할 수 있기 때문입니다. –
그래서 JFrame과 같은 최상위 컨테이너의'페인트 '를 덮어 쓰는 것이 좋지 않지만 전체 화면 전용 모드를 사용하면 상황이 악화 될 수 있습니다. FSEM에 사용 된 창은 내가했던 제한된 근절에서부터 100 % 확실하지는 않지만 시작한 창과 동일하지 않습니다. 코드는 또한 'BufferStrategy'를 올바르게 사용하지 않습니다 - 주제에 대한 JavaDocs와 튜토리얼을 읽어야합니다. 일반적인 사용 패턴을 강조합니다 – MadProgrammer
첫 번째 추천은'BufferStrategy' 작업입니다 - 시작하는 것이 좋습니다. 'Window'에 의존하지 않고'java.awt.Canvas'를 기반으로하는 클래스를 생성합니다. FSEM을 작동 시키려면 먼저 FSEM을 작동 시키십시오. – MadProgrammer