import java.awt.*; import java.awt.event.*; import java.awt.image.*; public class FullScreenField extends Panel { private GraphicsDevice device; private java.util.List balls; private java.util.Timer timer; private VolatileImage image; private int width; private int height; private static DisplayMode[] DISPLAY_MODES = new DisplayMode[] { new DisplayMode(640, 480, 32, DisplayMode.REFRESH_RATE_UNKNOWN), new DisplayMode(640, 480, 24, DisplayMode.REFRESH_RATE_UNKNOWN), new DisplayMode(640, 480, 16, DisplayMode.REFRESH_RATE_UNKNOWN), new DisplayMode(640, 480, 8, DisplayMode.REFRESH_RATE_UNKNOWN) }; public FullScreenField(){ initFullScreen(); balls = new java.util.ArrayList(); balls.add(new Ball(width, height)); timer = new java.util.Timer(); timer.schedule(new java.util.TimerTask(){ public void run(){ draw(); } }, 1000, 30); enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.KEY_EVENT_MASK); } public void processKeyEvent(KeyEvent event){ if(event.getID() == KeyEvent.KEY_RELEASED && event.getKeyCode() == KeyEvent.VK_Q){ device.setFullScreenWindow(null); System.exit(0); } } public void processMouseEvent(MouseEvent event){ if(event.getID() == MouseEvent.MOUSE_RELEASED){ if(event.getButton() == MouseEvent.BUTTON3){ balls.add(new Ball(width, height)); }else{ for(int i = 0 ; i < balls.size() ; i++){ ((Ball)balls.get(i)).turn(); } } } super.processMouseEvent(event); } private void initFullScreen(){ try{ GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); device = ge.getDefaultScreenDevice(); GraphicsConfiguration gc = device.getDefaultConfiguration(); Frame frame = new Frame(gc); frame.setIgnoreRepaint(true); frame.setUndecorated(true); frame.add(this); device.setFullScreenWindow(frame); if (device.isDisplayChangeSupported()) { selectDisplayMode(device); } frame.setVisible(true); } catch (Exception e){ e.printStackTrace(); device.setFullScreenWindow(null); System.exit(0); } } private DisplayMode matchDisplayMode(GraphicsDevice device) { for (int i = 0 ; i < DISPLAY_MODES.length ; i++) { DisplayMode[] modes = device.getDisplayModes(); for (int j = 0 ; j < modes.length ; j++) { if (modes[j].getWidth() == DISPLAY_MODES[i].getWidth() && modes[j].getHeight() == DISPLAY_MODES[i].getHeight() && modes[j].getBitDepth() == DISPLAY_MODES[i].getBitDepth() ) { return DISPLAY_MODES[i]; } } } return null; } private void selectDisplayMode(GraphicsDevice device) { DisplayMode optimum = matchDisplayMode(device); System.out.println(optimum.getBitDepth()); if (optimum != null) { device.setDisplayMode(optimum); } width = optimum.getWidth(); height = optimum.getHeight(); } private void initVolatileImage(){ if (image == null) { image = createVolatileImage(width, height); } } private void validateVolatileImage() { GraphicsConfiguration gc = this.getGraphicsConfiguration(); if (image.validate(gc) == VolatileImage.IMAGE_INCOMPATIBLE) { image = createVolatileImage(width, height); } } public void draw(){ for(int i = 0 ; i < balls.size() ; i++){ ((Ball)balls.get(i)).move(); } Graphics2D g = (Graphics2D)getGraphics(); initVolatileImage(); try{ do { validateVolatileImage(); Graphics2D gImage = (Graphics2D)image.getGraphics(); clear(gImage); for(int i = 0 ; i < balls.size() ; i++){ ((Ball)balls.get(i)).drawShadow(gImage); } for(int i = 0 ; i < balls.size() ; i++){ ((Ball)balls.get(i)).draw(gImage); } gImage.dispose(); g.drawImage(image, 0, 0, this); } while (image.contentsLost()); }catch(NullPointerException ex){} } private void clear(Graphics2D g){ g.setPaint(Color.white); g.fillRect(0, 0, width, height); } public static void main(String[] args){ FullScreenField field = new FullScreenField(); } }