Created
May 8, 2018 01:16
-
-
Save Hunachi/ecf03a26af5f474572e0f11dc6b68dfb to your computer and use it in GitHub Desktop.
kadai2-version2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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