Skip to content

Instantly share code, notes, and snippets.

@Hunachi
Created May 8, 2018 01:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Hunachi/ecf03a26af5f474572e0f11dc6b68dfb to your computer and use it in GitHub Desktop.
Save Hunachi/ecf03a26af5f474572e0f11dc6b68dfb to your computer and use it in GitHub Desktop.
kadai2-version2
package step02;
import java.awt.BasicStroke;
import java.awt.Color;
/**************************************************
* DigitalClockPanel.java
* ------------------------------
*
* Version: 1.00
* last change: Feb 2005
*
* written by Akira Nakano
* email: nakano@kurume-nct.ac.jp
* copyrighted (c) by Nakano Lab.
*
**************************************************/
//既存のパッケージの利用
//import java.awt.Graphics;
//import java.awt.Font;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.Line2D;
import java.text.SimpleDateFormat;
import java.util.Calendar;
//import javax.swing.JPanel;
import javax.swing.JPanel;
@SuppressWarnings("unused")
public class ClockPanel extends JPanel implements Runnable{
/**
* コンストラクタ
*/
public ClockPanel(){
super();
//Thredクラスのオブジェクトの作成
Thread thread = new Thread(this,"Timer");
//並列処理(Thread)の開始
thread.start();
System.out.println("ClockPanelコンストラクタ終了");
}
/**
* 並列処理(Thread)の実行
*/
public void run(){
while(true){
//sleep();
repaint();
}
}
/**
* 課題3:日付情報の描画
*/
public void paint(Graphics g){
Graphics2D g2 = (Graphics2D)g;
System.out.println("描画");
int font_size = 20; //フォントのサイズ
int grid = 10; //余白スペースのサイズ
g.setFont(new Font("TimesRoman", Font.BOLD, font_size)); //描画する文字のフォント設定
g.clearRect(0,0,this.getWidth(), this.getHeight()); //背景をベタ塗り(初期化)。背景色は白
/**↓↓↓↓↓ 課題3 ↓↓↓↓↓**/
//デジタル時計の情報(日付情報を調べ文字列にする)を取得
String time_str = getTime();
System.out.println(time_str);
//デジタル時計の文字の描画
g.drawString(time_str, 60, 30);
/**↑↑↑↑↑ 課題3 ↑↑↑↑↑**/
//アナログ時計の情報を計算
int r = 200; //半径
Point edge = new Point(grid*3, font_size+grid*3); //円の左上隅の座標
Point center = new Point(edge.x+r, edge.y+r); //円の中心の座標
Point edge_h = getHourHandPoint(center, (int)(r*0.6)); //短針の先端の座標を求める
Point edge_m = getMinuteHandPoint(center, r); //長針の先端の座標を求める
Point edge_s = getSecondHandPoint(center, r); //秒針の先端の座標を求める
/**↓↓↓↓↓ 課題4 ↓↓↓↓↓**/
//アナログ時計の描画
g.drawOval(edge.x, edge.y, r * 2, r * 2);
Calendar c = Calendar.getInstance();
//短針の描画
g2.setColor(
Color.getHSBColor(
(float)c.get(Calendar.HOUR)* 3,
(float)c.get(Calendar.HOUR) * 2,
(float)c.get(Calendar.HOUR)
)
);
BasicStroke bs = new BasicStroke(4.0f);
g2.setStroke(bs);
g2.draw(new Line2D.Double(edge_h, center));
//長針の描画
g2.setColor(
Color.getHSBColor(
(float)c.get(Calendar.MINUTE) * 3,
(float)c.get(Calendar.MINUTE) * 2,
(float)c.get(Calendar.MINUTE)
)
);
bs = new BasicStroke(2.0f);
g2.setStroke(bs);
g2.draw(new Line2D.Double(edge_m, center));
//秒針の描画
g2.setColor(
Color.getHSBColor(
(float)c.get(Calendar.SECOND) * 3,
(float)c.get(Calendar.SECOND) * 2,
(float)c.get(Calendar.SECOND)
)
);
bs = new BasicStroke(1.0f);
g2.setStroke(bs);
g2.draw(new Line2D.Double(edge_s, center));
/**↑↑↑↑↑ 課題4 ↑↑↑↑↑**/
}
public double second_(){
Calendar c = Calendar.getInstance();
return (((double)c.get(Calendar.SECOND) + ((double)c.get(Calendar.MILLISECOND) / 1000)) / 60);
}
public double min_(){
Calendar c = Calendar.getInstance();
return (((double)c.get(Calendar.MINUTE) + second_()) / 60);
}
/**
* 課題1:Calendarクラスを用いた日付情報の獲得
*/
public String getTime(){
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年 MM月 dd日 hh時 mm分 ss秒");
String str = sdf.format(c.getTime());
return str;
}
/**
* 課題2:短針の先の座標を計算する
* 第一引数は中心座標、第二引数は半径
*/
public Point getHourHandPoint(Point center, int r){
Calendar c = Calendar.getInstance();
double rad = Math.PI * 2 *(((double)(c.get(Calendar.HOUR) % 12) / 12));
double y = Math.cos(rad + Math.PI) * r + center.y;
double x = Math.sin(rad) * r + center.x;
return new Point((int)x, (int)y);
}
/**
* 課題2:長針の先の座標を計算する
* 第一引数は中心座標、第二引数は半径
*/
public Point getMinuteHandPoint(Point center, int r){
Calendar c = Calendar.getInstance();
double rad = Math.PI * 2 * (((double)c.get(Calendar.MINUTE) + second_()) / 60);
double y = Math.cos(rad + Math.PI) * r + center.y;
double x = Math.sin(rad) * r + center.x;
return new Point((int)x, (int)y);
}
/**
* 課題2:秒針の先の座標を計算する
* 第一引数は中心座標、第二引数は半径
*/
public Point getSecondHandPoint(Point center, int r){
Calendar c = Calendar.getInstance();
double rad = 2 * Math.PI * (((double)c.get(Calendar.SECOND) + ((double)c.get(Calendar.MILLISECOND) / 1000)) / 60);
double y = Math.cos(rad + Math.PI) * r + center.y;
double x = Math.sin(rad) * r + center.x;
return new Point((int)x, (int)y);
}
/**
* 100ms間のプログラムの停止
*/
public void sleep(){
try{
System.out.println("スリープ");
Thread.sleep(1000);
}
catch(InterruptedException e){
System.out.println("例外処理:"+e);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment