// BioRhythm.java import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class BioRhythm extends Applet implements ActionListener{ int w, h; int [] xpoints = new int[32]; int [][] ypoints = new int[3][32]; boolean flag = false; int lastDays; Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("JST")); int sum = 0; int birthY; int testY; int birthM; int testM; int birthD; int birthDayOfYear; Label mes; Label [] l1 = new Label[4]; Label [] l2 = new Label[3]; Label [] mu = new Label[2]; TextField [] t1 = new TextField[3]; TextField [] t2 = new TextField[2]; Button [] b1 = new Button[2]; Button [] scroll = new Button[2]; public void init(){ w = getSize().width; h = getSize().height; int bg = Integer.parseInt(getParameter("bgcolor"), 16); int fontSize = Integer.parseInt(getParameter("fontSize")); String fontFamily = getParameter("family"); String fontBold = getParameter("font"); if(fontBold.equals("Bold")){ setFont(new Font(fontFamily, Font.BOLD, fontSize)); } else if(fontBold.equals("Italic")){ setFont(new Font(fontFamily, Font.ITALIC, fontSize)); } else if(fontBold.equals("BoldItalic")){ setFont(new Font(fontFamily, Font.BOLD+Font.ITALIC, fontSize)); } else{ setFont(new Font(fontFamily, Font.PLAIN, fontSize)); } setBackground(new Color(bg)); setLayout(new BorderLayout()); Panel panel = new Panel(new GridLayout(2, 7)); panel.add(l1[0] = new Label("誕生日 : ")); panel.add(t1[0] = new TextField("", 4)); panel.add(l1[1] = new Label("年")); panel.add(t1[1] = new TextField("", 2)); panel.add(l1[2] = new Label("月")); panel.add(t1[2] = new TextField("", 2)); panel.add(l1[3] = new Label("日")); panel.add(l2[0] = new Label("調査月 : ")); panel.add(t2[0] = new TextField("", 4)); panel.add(l2[1] = new Label("年")); panel.add(t2[1] = new TextField("", 2)); panel.add(l2[2] = new Label("月")); panel.add(mu[0] = new Label("")); panel.add(mu[1] = new Label("")); Panel buttons = new Panel(new FlowLayout()); buttons.add(scroll[0] = new Button("< PREV")); buttons.add(b1[0] = new Button("O.K.")); buttons.add(b1[1] = new Button("CLEAR")); buttons.add(scroll[1] = new Button("NEXT >")); Panel lastPanel = new Panel(new BorderLayout()); lastPanel.add(panel, BorderLayout.NORTH); lastPanel.add(buttons, BorderLayout.CENTER); lastPanel.add(mes = new Label(""), BorderLayout.SOUTH); add(lastPanel, BorderLayout.SOUTH); b1[0].addActionListener(this); b1[1].addActionListener(this); scroll[0].addActionListener(this); scroll[1].addActionListener(this); } public void paint(Graphics g){ for(int i = 0; i < xpoints.length; i++){ xpoints[i] = i * (w/34) + 15; } // x軸の変化 g.drawLine(5, (h-110)/2, w-20, (h-110)/2); g.drawRect(5, 30, w-25, h-170); g.drawString("1", 15, h-125); g.drawString("10", 15+(int)(w/4+((w/34) * ((float)w/340))), h-125); g.drawString("20", 15+(int)(w/4+((w/34) * ((float)w/340)))*2, h-125); g.drawString("30", 15+(int)(w/4+((w/34) * ((float)w/340)))*3, h-125); // 参考日の描画(適当) g.setColor(Color.red); g.drawString("身体", w-110, 20); if(flag) g.drawPolyline(xpoints, ypoints[0], ypoints[0].length-1); g.setColor(Color.green); g.drawString("感情", w-75, 20); if(flag) g.drawPolyline(xpoints, ypoints[1], ypoints[1].length-1); g.setColor(Color.blue); g.drawString("知性", w-40, 20); if(flag) g.drawPolyline(xpoints, ypoints[2], ypoints[2].length-1); // 色の意味とバイオリズムを描画 // (起動時はフラグが立っていないためバイオリズムは表示されない) } public void actionPerformed(ActionEvent ae){ if(ae.getActionCommand().equals("CLEAR")){ t1[0].setText(""); t1[1].setText(""); t1[2].setText(""); t2[0].setText(""); t2[1].setText(""); for(int i = 1; i <= lastDays; i++){ ypoints[0][i-1] = 0; ypoints[1][i-1] = 0; ypoints[2][i-1] = 0; } flag = false; repaint(); } else if(ae.getActionCommand().equals("O.K.")){ getBirthAndTestDay(); paintBiorhythm(); } else if(ae.getActionCommand().equals("< PREV") && flag){ getBirthAndTestDay(); if(testM == 1){ testY--; testM = 12; } else{ testM--; } t2[0].setText(String.valueOf(testY)); t2[1].setText(String.valueOf(testM)); paintBiorhythm(); } else if(ae.getActionCommand().equals("NEXT >") && flag){ getBirthAndTestDay(); if(testM == 12){ testY++; testM = 1; } else{ testM++; } t2[0].setText(String.valueOf(testY)); t2[1].setText(String.valueOf(testM)); paintBiorhythm(); } } public void getBirthAndTestDay(){ String by, ty, bm, tm, bd; by = t1[0].getText(); ty = t2[0].getText(); bm = t1[1].getText(); tm = t2[1].getText(); bd = t1[2].getText(); if(by.equals("") || ty.equals("") || bm.equals("") || tm.equals("") || bd.equals("")) Message("入力していない項目があります。"); sum = 0; birthY = Integer.parseInt(by); testY = Integer.parseInt(ty); birthM = Integer.parseInt(bm); testM = Integer.parseInt(tm); birthD = Integer.parseInt(bd); if(birthM > 12 || birthM < 1 || testM > 12 || testM < 1) Message("月の指定が不正です。"); if(birthD > 31 || birthD < 1 || (birthM == 2 && birthD > 29) || (birthM <= 7 && birthM % 2 == 0 && birthD >= 31) || (birthM >= 8 && birthM % 2 == 1 && birthD >= 31)) Message("日の指定が不正です。"); if(birthY < 0 || testY < 0) Message("年の指定が不正です。"); } public void paintBiorhythm(){ if((birthY > testY) || (birthY == testY && birthM > testM)){ Message("誕生日以前のバイオリズムは表示出来ません。"); } cal.set(Calendar.MONTH, Calendar.DECEMBER); cal.set(Calendar.DATE, 31); for( ; birthY < testY; testY--){ cal.set(Calendar.YEAR, testY); sum += cal.get(Calendar.DAY_OF_YEAR); } // 閏年考慮の為、単に365足すのではなく一年の日数を年齢分足す cal.set(Calendar.YEAR, birthY); cal.set(Calendar.MONTH, birthM - 1); cal.set(Calendar.DATE, birthD); birthDayOfYear = cal.get(Calendar.DAY_OF_YEAR); // 誕生日が一年の何日目かを出す cal.set(Calendar.MONTH, testM); cal.set(Calendar.DATE, 1); cal.add(Calendar.DATE, -1); lastDays = cal.get(Calendar.DATE); ypoints[0] = new int[lastDays+1]; ypoints[1] = new int[lastDays+1]; ypoints[2] = new int[lastDays+1]; // 調査する月の末日を出し、その数の配列を用意 for(int i = 1; i <= lastDays; i++){ cal.set(Calendar.DATE, i); int testSum = sum + cal.get(Calendar.DAY_OF_YEAR) - birthDayOfYear; // ↑総経過日数 ↑その年の誕生日からその日までの経過日数↑ ypoints[0][i-1] = (int)((h-110)/2 - (h-170)/2 * Math.sin(2 * Math.PI * testSum / 23)); ypoints[1][i-1] = (int)((h-110)/2 - (h-170)/2 * Math.sin(2 * Math.PI * testSum / 28)); ypoints[2][i-1] = (int)((h-110)/2 - (h-170)/2 * Math.sin(2 * Math.PI * testSum / 33)); } // バイオリズムの各数値を配列に入れていく mes.setText(""); flag = true; repaint(); } public void Message(String s){ mes.setText(s); System.exit(0); } }