/****************************************************************************** * 星空ウォッチング(プラネタリウム) * * 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