Javaを使ってアナログ時計を作ろうと思います(ソース編③『役割ごとにメソッドに分けた+文字盤追加』)
先日UPしたソースはpaintConponentにまとめて記述していてしまったので、
役割ごとにメソッドに分けてみました。
それと、文字盤を追加しました(12等分)
package Clock; import java.awt.Color; import java.awt.Graphics; import java.awt.Dimension; import java.util.Calendar; import java.util.Timer; import java.util.TimerTask; import javax.swing.JFrame; import javax.swing.JComponent; import javax.swing.SwingUtilities; @SuppressWarnings("serial") public class Clock extends JComponent{ public static void main(String[] args){ Runnable myGUI = new Runnable(){ public void run(){ JFrame win = new JFrame("アナログ時計"); Clock comp = new Clock(); comp.setPreferredSize(new Dimension(500, 500)); win.add(comp); win.pack(); win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); win.setVisible(true); } }; SwingUtilities.invokeLater(myGUI); } private static class MyTimer extends TimerTask{ private Clock clock; public MyTimer(Clock clock) { this.clock = clock; } @Override public void run() { clock.repaint(); } } public Clock(){ Timer timer = new Timer(); //timer.schedule(new MyTimer(this),0,500); timer.schedule(new TimerTask(){ @Override public void run() { repaint(); }},0,500); } @Override public void paintComponent(Graphics g){ int second = 0; g.setColor(getBackground()); Calendar cal = Calendar.getInstance(); int hour = cal.get(Calendar.HOUR_OF_DAY); // 現在の時を取得 int minute = cal.get(Calendar.MINUTE); // 現在の分を取得 second = cal.get(Calendar.SECOND); // 現在の秒を取得 mojiban(g); secLine(second,g); minuteLine(minute,second,g); hourLine(hour,minute,second,g); } public void mojiban(Graphics g){ int width = getWidth(); int height = getHeight(); int centerX = width/2 ; int centerY = height/2; double mojiX1; double mojiY1; double mojiX2; double mojiY2; for(int i=0;i<=11;i++){ mojiX1 = (Math.sin(Math.toRadians(i * 30))) * 230; mojiY1 = -(Math.cos(Math.toRadians(i * 30))) * 230; mojiX2 = (Math.sin(Math.toRadians(i * 30))) * 245; mojiY2 = -(Math.cos(Math.toRadians(i * 30))) * 245; g.setColor(Color.BLACK); g.drawLine(centerX + (int)mojiX1, centerY + (int)mojiY1, centerX + (int)mojiX2 , centerY + (int)mojiY2); } } public void secLine(int second,Graphics g){ int width = getWidth(); int height = getHeight(); int centerX = width/2 ; int centerY = height/2; double secX ; double secY ; secX = (Math.sin(Math.toRadians(second * 6))) * 220; secY = -(Math.cos(Math.toRadians(second * 6))) * 220; g.setColor(Color.BLACK); g.drawLine(centerX, centerY, centerX + (int) secX, centerY+ (int) secY); } public void minuteLine(int minute,int second,Graphics g){ int width = getWidth(); int height = getHeight(); int centerX = width/2 ; int centerY = height/2; double minX ; double minY ; minX = (Math.sin(Math.toRadians(minute * 6 + (second * 6 / 60)))) * 180; minY = -(Math.cos(Math.toRadians(minute * 6 + (second * 6 / 60)))) * 180; g.setColor(Color.BLUE); g.drawLine(centerX, centerY, centerX + (int) minX, centerY+ (int) minY); } public void hourLine(int hour,int minute,int second,Graphics g){ int width = getWidth(); int height = getHeight(); int centerX = width/2 ; int centerY = height/2; double hourX ; double hourY ; hourX = (Math.sin(Math.toRadians(hour * 30 + (minute * 30 / 60) + (second * 30 / 3600)))) * 110; hourY = -(Math.cos(Math.toRadians(hour * 30 + (minute * 30 / 60) + (second * 30 / 3600)))) * 110; g.setColor(Color.RED); g.drawLine(centerX, centerY, centerX + (int) hourX, centerY+ (int) hourY); } }