7月12日 Javaゼミ練習問題 解答 南 慶典


問題1
デジタル時計をアプレットで作成しなさい。時計は何時何分何秒まで表示させること。

問題2
虹色カラーバーを作成し、左から右に動いていくアプレットを作成しなさい。その際ダブルバッファリングしていないものと、ダブルバッファリングしていないものと2つ作成しなさい。虹色カラーバーはP396~P397の例題を参照すること。


問題1

import java.applet.*;
import java.awt.*;
import java.util.*;

/*
  <applet code="TimeCounter" width=350 height=100>
  </applet>
 */


public class TimeCounter extends Applet
implements Runnable{
	
	int TThour, TTminute, TTsecond;
	int counter;
	Thread t;
	
	public void init(){
		
		Calendar calendar = Calendar.getInstance();
		TThour = calendar.get(calendar.HOUR_OF_DAY);
		TTminute = calendar.get(calendar.MINUTE);
		TTsecond = calendar.get(calendar.SECOND);
		
		// カウンタを初期化する
		counter = TTsecond;

		// スレッドを開始する
		t = new Thread(this);
		t.start();
	}
	
	public void run() {
		try{
			while(true){
				
				// 再描画を要求する
				repaint();
				
				// 次のカウンタを表示する前に休止する
				Thread.sleep(1000);
				
				// カウンタを1つ進める
				
				++counter;
				
				if(counter==60)
					counter=0;
			}
		}
		catch(Exception e){
		}
	}
	
	public void paint(Graphics g){
		
		//フォントを設定する
		g.setFont(new Font("Serif", Font.BOLD, 36));
		
		// フォントメトリックスを取得する
		FontMetrics fm = g.getFontMetrics();
		
		// カウンタを表示する
		int second = counter;
		String tthour = "" + TThour + "時";
		String ttminute = ""+ TTminute + "分";
		String ttsecond = second + "秒";
		
		Dimension d = getSize();
		int x1 = d.width / 3 - fm.stringWidth(tthour) / 2;
		int x2 = x1 + d.width / 3 - fm.stringWidth(ttminute) / 2;
		int x3 = x2 + d.width / 3 - fm.stringWidth(ttsecond) / 2;

		g.drawString(tthour, x1, d.height / 2);
		g.drawString(ttminute ,x2, d.height / 2);
		g.drawString(ttsecond, x3, d.height / 2);
		
		if(second == 59){
			second = 0;
			TTminute += 1 ;
		}
		else if(TTminute == 60){
			TTminute = 0;
			TThour += 1;
		}
		else if(TThour == 24){
			TThour = 0;
		}
		
	}
}


問題2

(ダブルバッファリングなし)
import java.applet.*;
import java.awt.*;
/*
 	<applet code="ColorBarsThread" width=280 height=280>
 	</applet>
 */


public class ColorBarsThread extends Applet
implements Runnable{
 	
	int Squarewidth[] = new int[7];
	int OverRect[] = new int[7];
 	Thread t;
 	
 	public void init(){

	 	for(int i=0;i<7;i++){
	 		Squarewidth[i] = i*40;
	 	}
	 	
 		// スレッドを開始する
 		t = new Thread(this);
 		t.start();
 	}
 	
 	public void run(){
 		try{
 			while(true){
 				
 				// 再描画を要求する
 				repaint();
 				
 				// ウィンドウを更新する前に休止する
 				Thread.sleep(25);
 			}
 		}
 		catch(Exception e){ 			
 		}
 	}
 	
	public void paint(Graphics g){

		int i=0;
		
		Color colors[] = {Color.blue, Color.cyan, Color.green,
				Color.yellow, Color.magenta, 
				Color.orange, Color.red };	
		
		Dimension d = getSize();

		for (i=0;i<colors.length;i++){
			g.setColor(colors[i]);
			g.fillRect(Squarewidth[i], 0, 40, d.height);
			
			Squarewidth[i] += 1;
			
			if(Squarewidth[i] > 240){
				OverRect[i] = Squarewidth[i] - 240;
				g.setColor(colors[i]);
				g.fillRect(0, 0, OverRect[i], d.height);
			}	
			if(Squarewidth[i] == 280)
				Squarewidth[i] = 0;
		}
	}
}



(ダブルバッファリングあり)
import java.applet.*;
import java.awt.*;
/*
 	<applet code="DBColorBarsThread" width=280 height=280>
 	</applet>
 */

public class DBColorBarsThread extends Applet
implements Runnable{
 	
	int Squarewidth[] = new int[7];
	int OverRect[] = new int[7];
	Image buffer;
	Graphics bufferg;
 	Thread t;
 	
 	public void init(){

	 	for(int i=0;i<7;i++){
	 		Squarewidth[i] = i*40;
	 	}
	 	
 		// スレッドを開始する
 		t = new Thread(this);
 		t.start();
 		
 		Dimension d = getSize();
 		buffer = createImage(d.width, d.height);
 	}
 	
 	public void run(){
 		try{
 			while(true){
 				
 				// 再描画を要求する
 				repaint();
 				
 				// ウィンドウを更新する前に休止する
 				Thread.sleep(25);
 			}
 		}
 		catch(Exception e){ 			
 		}
 	}
 	
 	public void update(Graphics g){
 		paint(g);
 	}
 	
	public void paint(Graphics g){
		
		// バッファのグラフィックコンテキストを取得する
		if (bufferg == null)
			bufferg = buffer.getGraphics();
		
		Color colors[] = {Color.blue, Color.cyan, Color.green,
				Color.yellow, Color.magenta, 
				Color.orange, Color.red };	
		
		Dimension d = getSize();

		for (int i=0;i<colors.length;i++){
			bufferg.setColor(colors[i]);
			bufferg.fillRect(Squarewidth[i], 0, 40, d.height);
			
			// ウィンドウを更新する
			g.drawImage(buffer, 0, 0, this);
			
			Squarewidth[i] += 1;
			
			if(Squarewidth[i] > 240){
				OverRect[i] = Squarewidth[i] - 240;
				bufferg.setColor(colors[i]);
				bufferg.fillRect(0, 0, OverRect[i], d.height);
				
				// ウィンドウを更新する
				g.drawImage(buffer,0,0,this);
				
			}	
			if(Squarewidth[i] == 280)
				Squarewidth[i] = 0;

		}
	}
}