//************************************************************* // Java application // 「TimeManager」 // //          作 成 者:ルート高菜    //          作成開始月:2006/5 //          最終更新月:2006/6 [TN083/J73] //************************************************************* import java.applet.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.io.File; import java.net.*; import javax.swing.*; public class TimeManager extends JFrame implements ActionListener,Runnable { //Eclipseの場合、シリアライズ可能クラスでこれがないと警告が出る private static final long serialVersionUID=0; // public static void main(String[] args) { TimeManager frame=new TimeManager(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //右上×印で終了 frame.setVisible(true); frame.setLocationRelativeTo(null); //画面の真ん中に表示 } // // private double min=0; private double sec=0; // private boolean reverse=false; //「減少」の場合はtrue private boolean stopped=false; //スレッド停止用のフラグ private Thread thisThread; // AudioClip finish; // JComboBox timeList=new JComboBox(); int[] timeListNum={0,1,3,5,10,15,20,25,30,35,40,45,50,55,60,90,120,180}; JButton set=new JButton("セット"); // JLabel time=new JLabel("0分0秒"); JButton increase=new JButton("増加"); JButton decrease=new JButton("減少"); JButton stop=new JButton("中止"); //コンストラクタ public TimeManager(){ setTitle("TimeManager version 1.0"); setSize(300,400); // try{ //jar外に「finish.wav」があるか String dir=System.getProperty("user.dir")+File.separator; File file=new File(dir+"finish.wav"); if(file.exists()){ // finish=Applet.newAudioClip(file.toURL()); //ローカルファイルとしてのURLを作る }else{ //jar外になければ内部のを使う finish=Applet.newAudioClip(getClass().getResource("infinish.wav")); } }catch(MalformedURLException exception){ //エラーならば内部のを使う finish=Applet.newAudioClip(getClass().getResource("infinish.wav")); } // timeList.addItem("0分"); timeList.addItem("1分"); timeList.addItem("3分"); timeList.addItem("5分"); timeList.addItem("10分"); timeList.addItem("15分"); timeList.addItem("20分"); timeList.addItem("25分"); timeList.addItem("30分"); timeList.addItem("35分"); timeList.addItem("40分"); timeList.addItem("45分"); timeList.addItem("50分"); timeList.addItem("55分"); timeList.addItem("60分"); timeList.addItem("90分"); timeList.addItem("120分"); timeList.addItem("180分"); // JPanel setPanel=new JPanel(); setPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY)); setPanel.add(timeList); setPanel.add(set); //時計描画用のパネル ClockPanel clockPanel=new ClockPanel(); clockPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"Timer")); //枠線 clockPanel.setBackground(Color.WHITE); // JPanel buttonPanel=new JPanel(); buttonPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY)); buttonPanel.add(time); buttonPanel.add(increase); buttonPanel.add(decrease); buttonPanel.add(stop); // //コンテナ枠 Container cp=getContentPane(); cp.add(setPanel,BorderLayout.NORTH); cp.add(clockPanel,BorderLayout.CENTER); cp.add(buttonPanel,BorderLayout.SOUTH); // set.addActionListener(this); increase.addActionListener(this); decrease.addActionListener(this); stop.addActionListener(this); // stop.setEnabled(false); } //ボタンイベント public void actionPerformed(ActionEvent e){ if(e.getSource()==increase){ reverse=false; enableButtons(true); startAction(); }else if(e.getSource()==decrease){ reverse=true; enableButtons(true); startAction(); }else if(e.getSource()==stop){ setStopped(true); enableButtons(false); }else if(e.getSource()==set){ min=timeListNum[timeList.getSelectedIndex()]; sec=0; // time.setText((int)min+"分"+(int)sec+"秒"); repaint(); } } //開始処理 private void startAction(){ thisThread=new Thread(this); setStopped(false); thisThread.start(); } //ボタンをまとめて有効・無効 private void enableButtons(boolean running){ set.setEnabled(!running); increase.setEnabled(!running); decrease.setEnabled(!running); stop.setEnabled(running); } //停止フラグの操作・取得 private void setStopped(boolean flag){ stopped=flag; } private boolean isStopped(){ return stopped; } // public void run() { //停止フラグをチェックしながらループ while(!isStopped()){ //増減 if(reverse){ if(sec>0){ sec--; }else{ if(min>0){ min--; sec=59; } } }else{ sec++; if(sec>=60){ min++; sec=0; } } // time.setText((int)min+"分"+(int)sec+"秒"); // repaint(); //終了チェック if(min==0 && sec==0){ setStopped(true); enableButtons(false); finish.play(); toFront(); //全面に }else{ // try{ Thread.sleep(1000); }catch(InterruptedException e){ setStopped(true); } } } } //時計描画用のパネル(内部クラス) class ClockPanel extends JPanel{ //Eclipseの場合、シリアライズ可能クラスでこれがないと警告が出る private static final long serialVersionUID=0; //外枠から離す距離 static final int SPACE=20; // double centerX,centerY,radiusX,radiusY; double minAngle,secAngle; //swingの描画メソッド public void paintComponent(Graphics g){ super.paintComponent(g); //パネルの大きさに合わせる centerX=getWidth()/2; centerY=getHeight()/2; radiusX=centerX-SPACE; radiusY=centerY-SPACE; // Graphics2D g2=(Graphics2D)g; //外円 Ellipse2D circle=new Ellipse2D.Double(SPACE,SPACE,radiusX*2,radiusY*2); g2.draw(circle); //分針 minAngle=Math.toRadians(90-360*min/60); drawArm(g2,minAngle,0.6*radiusX,0.6*radiusY,centerX,centerY); //秒針 secAngle=Math.toRadians(90-360*sec/60); drawArm(g2,secAngle,0.8*radiusX,0.8*radiusY,centerX,centerY); } //時計の針を描画 private void drawArm(Graphics2D g2,double angle,double lengthX,double lengthY,double startX,double startY){ Point2D center=new Point2D.Double(startX,startY); Point2D end=new Point2D.Double(startX+lengthX*Math.cos(angle),startY-lengthY*Math.sin(angle)); g2.draw(new Line2D.Double(center,end)); } } }