スレッド

パネルをクリックすると停止と一時停止ができる

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.AffineTransform;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainFrm extends JFrame{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public static void main(String[] args) {
		MainFrm MyFrm = new MainFrm();
		
		MyFrm.setVisible(true);
	}
	
	public MainFrm() {
		// TODO Auto-generated constructor stub
		
		//フレームクローズでプロセスも閉じる。
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		//フレームのタイトル
		setTitle("メインフレーム");

		//拡張したパネルを作成
		final ExPanel pnl = new ExPanel(400, 300);
		add(pnl);
		
		//フレームを中身の大きさに自動調整
		pack();
	}
	
	private class ExPanel extends JPanel implements Runnable, MouseListener{
		
		/**
		 * スレッドを追加したパネル
		 */
		private static final long serialVersionUID = 1L;
		
		private boolean StopFlg = false;
		
		private int x = 0;
		private int y = 0;
		private int theta = 0;
		private int vtheta = 5;
		private int size = 30;
		
		
		public ExPanel(int pnlWidth, int pnlHeight) {
			// TODO Auto-generated constructor stub
			setPreferredSize(new Dimension(pnlWidth, pnlHeight));
			
			x = pnlWidth / 2;
			y = pnlHeight / 2;
			
			//クリックイベントをパネルが受け取れるように
			setFocusable(true);
			addMouseListener(this);
			
			//スレッドを開始
			Thread MyThread = new Thread(this);
			MyThread.start();
		}
		
		//パネルがクリックされたらStopFlgを反転
		public synchronized void StartStop(){
			StopFlg = !StopFlg;
			
			//wait()状態のスレッドをたたき起こす
			notify();
		}
		
		@Override
		public void paint(Graphics g) {
			// TODO Auto-generated method stub
			super.paint(g);
			Graphics2D g2d = (Graphics2D) g;
			
			//座標(x,y)を中心にしてtheta度だけ回転
			AffineTransform at = new AffineTransform();
			theta = (theta + vtheta) % 360;
			at.setToRotation(Math.PI * theta / 180 , x, y);
			g2d.setTransform(at);
			
			//四角形を描画
			g2d.drawRect(x, y, size, size);
		}
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			while(true){
				//再描画
				repaint();
				
				try {
					//20ミリ秒だけスリープ
					Thread.sleep(20);
					
					//同期をとる
					synchronized (this) {
						if(StopFlg){
							wait();
						}
					}
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		}

		@Override
		public void mouseClicked(MouseEvent e) {
			// TODO Auto-generated method stub
			//パネルがクリックされたら
			StartStop();
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
	}
}


最終更新:2011年06月14日 00:45
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。