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;
}
}
}