The Way to Programming
The Way to Programming
I am new to Java.
I got the code to display an analog clock from the net. However, I would like to use the whole screen instead of a window. Anyone can help?
Also, there is a bug that draw a line from upper left corner to the circumference. Anyone know where is the bug and how to fix it?
Thanks!
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import javax.swing.JFrame; import javax.swing.JPanel; public class Clock extends JPanel implements Runnable { Thread thread = null; SimpleDateFormat formatter = new SimpleDateFormat("s", Locale.getDefault()); Date currentDate; int xcenter = 175, ycenter = 175, lastxs = 0, lastys = 0, lastxm = 0, lastym = 0, lastxh = 0,lastyh = 0; private void drawStructure(Graphics g) { g.setFont(new Font("TimesRoman", Font.BOLD, 20)); g.setColor(Color.black); g.fillOval(xcenter - 150, ycenter - 150, 300, 300); g.setColor(Color.green); g.drawString("9", xcenter - 145, ycenter +0); g.drawString("3", xcenter + 135, ycenter + 0); g.drawString("12", xcenter - 10, ycenter - 130); g.drawString("6", xcenter - 10, ycenter + 145); } // drawStructure public void paint(Graphics g) { int xhour, yhour, xminute, yminute, xsecond, ysecond, second, minute, hour; drawStructure(g); currentDate = new Date(); formatter.applyPattern("s"); second = Integer.parseInt(formatter.format(currentDate)); formatter.applyPattern("m"); minute = Integer.parseInt(formatter.format(currentDate)); formatter.applyPattern("h"); hour = Integer.parseInt(formatter.format(currentDate)); xsecond = (int) (Math.cos(second * 3.14f / 30 - 3.14f / 2) * 120 + xcenter); ysecond = (int) (Math.sin(second * 3.14f / 30 - 3.14f / 2) * 120 + ycenter); xminute = (int) (Math.cos(minute * 3.14f / 30 - 3.14f / 2) * 100 + xcenter); yminute = (int) (Math.sin(minute * 3.14f / 30 - 3.14f / 2) * 100 + ycenter); xhour = (int) (Math.cos((hour * 30 + minute / 2) * 3.14f / 180 - 3.14f / 2) * 80 + xcenter); yhour = (int) (Math.sin((hour * 30 + minute / 2) * 3.14f / 180 - 3.14f / 2) * 80 + ycenter); // Erase if necessary, and redraw g.setColor(Color.magenta); if (xsecond != lastxs || ysecond != lastys) { g.drawLine(xcenter, ycenter, lastxs, lastys); } if (xminute != lastxm || yminute != lastym) { g.drawLine(xcenter, ycenter - 1, lastxm, lastym); g.drawLine(xcenter - 1, ycenter, lastxm, lastym); } if (xhour != lastxh || yhour != lastyh) { g.drawLine(xcenter, ycenter - 1, lastxh, lastyh); g.drawLine(xcenter - 1, ycenter, lastxh, lastyh); } g.setColor(Color.magenta); g.drawLine(xcenter, ycenter, xsecond, ysecond); g.setColor(Color.red); g.drawLine(xcenter, ycenter - 1, xminute, yminute); g.drawLine(xcenter - 1, ycenter, xminute, yminute); g.setColor(Color.green); g.drawLine(xcenter, ycenter - 1, xhour, yhour); g.drawLine(xcenter - 1, ycenter, xhour, yhour); lastxs = xsecond; lastys = ysecond; lastxm = xminute; lastym = yminute; lastxh = xhour; lastyh = yhour; } // paint public void start() { if (thread == null) { thread = new Thread(this); thread.start(); } } // start public void stop() { thread = null; } // stop public void run() { while (thread != null) { try { Thread.sleep(100); } catch (InterruptedException e) { } repaint(); } // while thread = null; } // run public void update(Graphics g) { paint(g); } // update public static void main(String args[]) { JFrame window = new JFrame(); Color c=new Color(118,73,190); window.setBackground(c); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setBounds(0, 0, 400, 400); Clock clock = new Clock(); window.getContentPane().add(clock); window.setVisible(true); clock.start(); } // main } // Clock
You should be able to do
SimpleScreenManager screen = new SimpleScreenManager(); DisplayMode[] availableModes = screen.getCompatibleModes(); DisplayMode displayMode = screen.findFirstCompatibleMode(availableModes); screen.setFullScreen(displayMode); // do your funky stuff involving Graphics i guess screen.update(); // everytime there is a change
import java.awt.*; import javax.swing.JFrame; /** The SimpleScreenManager class manages initializing and displaying full screen graphics modes. */ public class SimpleScreenManager { private GraphicsDevice device; /** Creates a new SimpleScreenManager object. */ public SimpleScreenManager() { GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment(); device = environment.getDefaultScreenDevice(); } /** Returns a list of compatible display modes for the default device on the system. */ public DisplayMode[] getCompatibleDisplayModes() { return device.getDisplayModes(); } /** Returns the first compatible mode in a list of modes. Returns null if no modes are compatible. */ public DisplayMode findFirstCompatibleMode(DisplayMode modes[]) { DisplayMode goodModes[] = device.getDisplayModes(); for (int i = 0; i < modes.length; i++) { for (int j = 0; j < goodModes.length; j++) { if (displayModesMatch(modes[i], goodModes[j])) { return modes[i]; } } } return null; } /** Enters full screen mode and changes the display mode. */ 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) { ex.printStackTrace(); } } } /** Returns the window currently used in full screen mode. */ public Window getFullScreenWindow() { return device.getFullScreenWindow(); } /** Restores the screen's display mode. */ public void restoreScreen() { Window window = device.getFullScreenWindow(); if (window != null) { window.dispose(); } device.setFullScreenWindow(null); } /** Updates the display. */ public void update() { Window window = device.getFullScreenWindow(); if (window != null) { BufferStrategy strategy = window.getBufferStrategy(); if (!strategy.contentsLost()) { strategy.show(); } } // Sync the display on some systems. // (on Linux, this fixes event queue problems) Toolkit.getDefaultToolkit().sync(); } }
Sign in to your account