/******************************************************************************
* 星空ウォッチング(プラネタリウム) *
* by「菊池さん」 *
* Copyright(C) 2001 Kikuchi-san's workshop. All rights reserved. *
*****************************************************************************/
import java.applet.Applet;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
public class SkyWatching extends Applet implements SkyData {
SkyStatus status; //ステータスパネル
SkyControls controls; //コントロールパネル
SkyCanvas canvas; //描画キャンパス
public void init() {
//背景・描画色とレイアウト設定
setBackground(new Color(0,0,192));
setForeground(new Color(0,0,0));
setLayout(new BorderLayout());
canvas = new SkyCanvas();
add("Center", canvas);
add("North", status = new SkyStatus(canvas));
add("South", controls = new SkyControls(canvas));
}
public void destroy() {
remove(status);
remove(controls);
remove(canvas);
}
public void start() {
status.setEnabled(true);
controls.setEnabled(true);
}
public void stop() {
status.setEnabled(false);
controls.setEnabled(false);
}
public void processEvent(AWTEvent evt) {
if (evt.getID() == Event.WINDOW_DESTROY) { System.exit(0); }
}
public static void main(String args[]) {
Frame f = new Frame("SkyWatching");
SkyWatching skyWatching = new SkyWatching();
skyWatching.init();
skyWatching.start();
f.add("Center", skyWatching);
f.show();
}
public String getAppletInfo() {
return "星空ウォッチング(プラネタリウム)\nby「菊池さん」 ";
}
} //end of SkyWatching
// 描画キャンパス
class SkyCanvas extends Canvas {
SkyData data; //観測地、星データ
//日付取得
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int mon = now.get(Calendar.MONTH)+1;
int day = now.get(Calendar.DAY_OF_MONTH);
int hour = now.get(Calendar.HOUR_OF_DAY);
int min = now.get(Calendar.MINUTE);
String datenow = year+"/"+mon+"/"+day;
String hournow = hour+":"+min;
//初期値設定
int R = 600; //天球の半径
int offsetX = 10; //横両サイドのりしろ
int offsetY = 20; //縦両サイドのりしろ
int msize = 12; //表示文字のサイズ(px)
int cityNo = 0; //観測地No
String LNG = data.lng[0]; //観測地経度
String LAT = data.lat[0]; //観測地緯度
String DATE = datenow; //日付
String HOUR = hournow; //時刻
String EW = "E"; //東・西経
String NS = "N"; //北・南緯
String direction[] = {"西","北","東"}; //方角バー
//判定フラグ
boolean bool_All = false; //再描画
boolean bool_Star = false; //星名表示
boolean bool_Seiza = false; //星座表示
//描画部品定義
public void paintSky(Graphics g) { //半天球
g.setColor(Color.black);
g.fillArc(offsetX,offsetY,R,R,0,180);
}
public void paintStar(Graphics g) { //星
g.setColor(Color.yellow);
for (int i = 0; i < data.X.length; i++)
g.fillOval(data.X[i],data.Y[i],data.SM[i],data.SM[i]);
}
public void paintStarName(Graphics g) { //星名
g.setColor(Color.lightGray);
for (int i = 0; i < data.X.length; i++)
g.drawString(data.star_name[i],data.X[i],data.Y[i]-4);
}
public void paintSeiza(Graphics g) { //星座
g.setColor(Color.blue);
for (int i = 0; i < data.X.length-1; i++)
g.drawLine(data.X[i],data.Y[i],data.X[i+1],data.Y[i+1]);
g.setColor(Color.pink);
for (int i = 0; i < data.seiza_name.length; i++)
g.drawString(data.seiza_name[i],(data.X[i]+data.X[i+1])/2,(data.Y[i]+data.Y[i+1])/2);
}
public void paintBar(Graphics g) { //方角バー
g.setColor(new Color(230,230,230));
g.fillRoundRect(offsetX,R/2+offsetY,R,msize,10,5);
g.setColor(Color.red);
g.drawString(direction[0],offsetX,R/2+offsetY+msize-2);
g.drawString(direction[1],R/2+offsetX-msize/2,R/2+offsetY+msize-2);
g.drawString(direction[2],R+offsetX-msize,R/2+offsetY+msize-2);
}
//描画
public void paint(Graphics g) {
setSize(R+offsetX*2,R/2+offsetY*2+msize); //サイズ設定
g.setColor(Color.white);
g.drawString(DATE,20,20);
g.drawString(HOUR,80,20);
g.drawString("観測地 "+data.city[cityNo],20,32);
g.drawString(EW+" "+LNG,20,44);
g.drawString(NS+" "+LAT,90,44);
paintSky(g);
if (bool_Seiza) paintSeiza(g);
paintStar(g);
if (bool_Star) paintStarName(g);
paintBar(g);
}
//再描画
public void redraw(boolean bool_All) {
this.bool_All = bool_All;
repaint();
}
} //end of SkyCanvas
// ステータスパネル
class SkyStatus extends Panel implements ActionListener, ItemListener {
SkyData data; //観測地、星データ
SkyCanvas canvas; //描画キャンパス
Choice choice_Direction = new Choice();
Choice choice_City = new Choice();
Choice choice_Sign_lng = new Choice();
Choice choice_Sign_lat = new Choice();
Button button_help = new Button("ヘルプ");
Button button_redraw = new Button("再描画");
TextField textfield_lng;
TextField textfield_lat;
TextField textfield_date;
TextField textfield_hour;
public SkyStatus(SkyCanvas canvas) {
this.canvas = canvas;
//テキストフィールド初期値セット
textfield_lng = new TextField(canvas.LNG,10);
textfield_lat = new TextField(canvas.LAT,10);
textfield_date = new TextField(canvas.DATE,10);
textfield_hour = new TextField(canvas.HOUR,10);
//ステータスパネル作成
setLayout(new GridLayout(2,1));
setBackground(new Color(192,192,192));
//上段
add(new Label("方角:",Label.RIGHT));
choice_Direction.addItem("北");
choice_Direction.addItem("南");
choice_Direction.addItem("東");
choice_Direction.addItem("西");
add(choice_Direction); choice_Direction.addItemListener(this);
add(new Label("経度:",Label.RIGHT));
choice_Sign_lng.addItem("E");
choice_Sign_lng.addItem("W");
add(choice_Sign_lng); choice_Sign_lng.addItemListener(this);
add(textfield_lng);
add(new Label("日付:",Label.RIGHT));
add(textfield_date);
add(button_help); button_help.addActionListener(this);
//下段
add(new Label("観測地:",Label.RIGHT));
for (int i = 0; i < data.city.length; i++) choice_City.addItem(data.city[i]);
add(choice_City); choice_City.addItemListener(this);
add(new Label("緯度:",Label.RIGHT));
choice_Sign_lat.addItem("N");
choice_Sign_lat.addItem("S");
add(choice_Sign_lat); choice_Sign_lat.addItemListener(this);
add(textfield_lat);
add(new Label("時刻:",Label.RIGHT));
add(textfield_hour);
add(button_redraw); button_redraw.addActionListener(this);
}
//ボタンイベント
public void actionPerformed(ActionEvent evt) {
String arg = evt.getActionCommand(); //ボタン文字列
canvas.LNG = textfield_lng.getText().trim();
canvas.LAT = textfield_lat.getText().trim();
canvas.DATE = textfield_date.getText().trim();
canvas.HOUR = textfield_hour.getText().trim();
canvas.redraw(arg.equals("再描画"));
} //end of actionPerformed
//ポップアップメニューイベント
public void itemStateChanged(ItemEvent evt) {
Object src = evt.getSource();
String arg = (String)evt.getItem();
if (src == choice_Direction) {
if (arg == "北") {
canvas.direction[0]="西"; canvas.direction[1]="北"; canvas.direction[2]="東";
} else if (arg == "南"){
canvas.direction[0]="東"; canvas.direction[1]="南"; canvas.direction[2]="西";
} else if (arg == "東"){
canvas.direction[0]="北"; canvas.direction[1]="東"; canvas.direction[2]="南";
} else if (arg == "西"){
canvas.direction[0]="南"; canvas.direction[1]="西"; canvas.direction[2]="北";
}
}
if (src == choice_City) {
for (int i = 0; i < data.city.length; i++) {
if (arg == data.city[i]) {
textfield_lng.setText(data.lng[i]);
textfield_lat.setText(data.lat[i]);
canvas.cityNo = i;
break;
}
}
}
if (src == choice_Sign_lng) {
if (arg == "E") { canvas.EW="E"; }
else if (arg == "W") { canvas.EW="W"; }
}
if (src == choice_Sign_lat) {
if (arg == "N") { canvas.NS="N"; }
else if (arg == "S") { canvas.NS="S"; }
}
} //end of itemStateChanged
} //end of SkyStatus
// コントロールパネル
class SkyControls extends Panel implements ActionListener, ItemListener {
SkyCanvas canvas; //描画キャンパス
Button button_Motion = new Button("日周運動開始");
Choice choice_Motion = new Choice();
Button button_Star = new Button("星名表示");
Button button_Seiza = new Button("星座表示");
Button button_trace = new Button("航跡表示");
Button button_Zoomin = new Button("+");
Button button_Zoomout = new Button("−");
public SkyControls(SkyCanvas canvas) {
this.canvas = canvas;
//コントロールパネル作成
setBackground(new Color(0,192,192));
add(button_Motion); button_Motion.addActionListener(this);
add(new Label("速度:",Label.RIGHT));
for (int i = 1; i < 10; i++) choice_Motion.addItem(String.valueOf(i));
add(choice_Motion); choice_Motion.addItemListener(this);
add(button_Star); button_Star.addActionListener(this);
add(button_Seiza); button_Seiza.addActionListener(this);
add(button_trace); button_trace.addActionListener(this);
add(new Label("ズーム:",Label.RIGHT));
add(button_Zoomin); button_Zoomin.addActionListener(this);
add(button_Zoomout); button_Zoomout.addActionListener(this);
}
//ボタンイベント
public void actionPerformed(ActionEvent evt) {
Object src = evt.getSource(); //イベント種類
String arg = evt.getActionCommand(); //イベント文字列
if (src == button_Motion) {
if (arg.equals("日周運動開始")) {
button_Motion.setLabel("日周運動停止");
System.out.println("日周運動開始 pressed!");
}
if (arg.equals("日周運動停止")) {
button_Motion.setLabel("日周運動開始");
System.out.println("日周運動停止 pressed!");
}
}
if (src == button_Star) {
if (arg.equals("星名表示")) {
button_Star.setLabel("星名消去");
canvas.bool_Star = true;
canvas.repaint();
}
if (arg.equals("星名消去")) {
button_Star.setLabel("星名表示");
canvas.bool_Star = false;
canvas.repaint();
}
}
if (src == button_Seiza) {
if (arg.equals("星座表示")) {
canvas.bool_Seiza = true;
button_Seiza.setLabel("星座消去");
canvas.repaint();
}
if (arg.equals("星座消去")) {
button_Seiza.setLabel("星座表示");
canvas.bool_Seiza = false;
canvas.repaint();
}
}
if (src == button_trace) {
if (arg.equals("航跡表示")) {
button_trace.setLabel("航跡消去");
System.out.println("航跡表示 pressed!");
}
if (arg.equals("航跡消去")) {
button_trace.setLabel("航跡表示");
System.out.println("航跡消去 pressed!");
}
}
if (src == button_Zoomin) {
System.out.println("+ pressed!");
}
if (src == button_Zoomout) {
System.out.println("− pressed!");
}
} //end of actionPerformed
//ポップアップメニューイベント
public void itemStateChanged(ItemEvent evt) {
Object src = evt.getSource();
String arg = (String)evt.getItem();
if (src == choice_Motion) {
System.out.println("速度 "+arg+" selected!");
}
} //end of itemStateChanged
} //end of SkyControls