12月9日課題 g241047 杉山貴紹
[イメージの説明]
アプレットでは下のイメージを用いた。見ての通り、アプレットの操作法が分かるようになっている。
[プログラムの説明]
大まかに説明するとこのプログラムには、上のイメージにあるように、
●kキーの入力で雪を描く。
●3つのボタンで雪の色を変えたり、色を白に戻したり、雪を消したりできる。
●テキストフィールドの文字列が雪だるまのセリフになる。
といったことほかに、
●左上に「ヘルプ」と書かれたボタンのようなものを設け、これをクリックすることで上のイメージを出したり消したりできる。
という機能をつけた。
[プログラム本体]
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;
import java.applet.*;
class Yuki{//雪の座標とサイズを保持するクラス
public int xx,yy,zz;
public Yuki(int x,int y,int z){
xx=x;
yy=y;
zz=z;
}
}
class Canvas1202 extends Canvas implements KeyListener,MouseListener{
Vector YukiArray;
Image image;
Random r=new Random();//雪の座標とサイズと色をランダムにするため
Color YukiColor,HelpColor;//雪とヘルプボタン(後述)の文字の色を変数にする。
String serifu,help;//雪ダルマのセリフとヘルプボタンのラベルを変数とする。
boolean helpwindow=false;//ヘルプが参照されているかどうかを判断する変数。
public Canvas1202(){
super();
YukiArray=new Vector();
YukiColor=Color.white;
serifu="今夜も徹夜か...";
setSize(600,510);
addKeyListener(this);
addMouseListener(this);
}
Image offScreenImage;//画面のちらつきを減らす
Graphics offScreenGraphics;
public void update(Graphics g){
if(offScreenImage==null){
offScreenImage=createImage(600,510);
offScreenGraphics=offScreenImage.getGraphics();
}
paint(offScreenGraphics);
g.drawImage(offScreenImage,0,0,this);
}
public void paint(Graphics g){
int i;
System.out.println("paint(" + g + ")is called");
g.setColor(Color.blue);
g.fillRect(0,0,600,510);
g.setColor(Color.gray);
g.fillRect(0,255,600,255);
g.setColor(Color.white);
g.fillOval(200,255,200,200);
g.fillOval(250,155,150,150);
g.fillOval(420,105,150,75);
int[] x0={490,450,420};
int[] y0={155,155,205};
g.fillPolygon(x0,y0,3);
g.setColor(Color.black);
int[] x1={350,400,390,295};
int[] y1={105,125,195,160};
g.fillPolygon(x1,y1,4);
g.setFont(new Font("HG創英角ポップ体",Font.PLAIN,18));
g.drawString(serifu,430,150);
g.setColor(Color.yellow);
g.fillOval(100,55,100,100);
g.setColor(Color.blue);
g.fillOval(130,55,100,100);
//雪を描く部分
g.setColor(YukiColor);
int size=YukiArray.size();
for(i=0;i<size;i=i+1){
Yuki Y=(Yuki)YukiArray.elementAt(i);
g.fillOval( Y.xx , Y.yy , Y.zz , Y.zz );
}
if(serifu=="セリフ長いよ!"||serifu=="何か入れろよ!"){//雪ダルマが怒った発言をした際に怒りを表す血管マークを表示。
g.setColor(Color.red);
g.setFont(new Font("",Font.PLAIN,20));
g.drawString("┛",345,210);
g.drawString("┗",355,210);
g.drawString("┓",345,220);
g.drawString("┏",355,220);
}
if(helpwindow==true){ //ヘルプウィンドウがオンになるとヘルプボタンのラベルが"閉じる"に変わる。
g.drawImage(image,90,130,this);
help=" 閉じる ";
HelpColor=Color.red;
}
else{
help=" ヘルプ "; //ヘルプウィンドウを閉じるとヘルプボタンのラベルは
HelpColor=Color.black;//"ヘルプ"に変わる。
}
g.setColor(Color.cyan); //ヘルプボタンとなる長方形をキャンバス左上に描画。
g.fill3DRect(5,5,80,25,true);
g.setColor(HelpColor);
g.setFont(new Font("",Font.BOLD,14));
g.drawString(help,15,20);
}
public void keyPressed(KeyEvent e){
int key=e.getKeyChar();
System.out.println("keyPressed("+ e + ","+ key + ")");
if(key=='k'){//kを押すたびに雪が描かれる。ヘルプウィンドウはオフになる。
int x1,y1,z1;
x1=r.nextInt(599)+1;
y1=r.nextInt(509)+1;
z1=10 + r.nextInt(9)+1;
YukiArray.addElement(new Yuki(x1,y1,z1));
helpwindow=false;
repaint();
}
}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
public void mouseClicked(MouseEvent e){
int mx=e.getX(), my=e.getY();
System.out.println("mouseClicked("+e+","+mx+","+my+")");
if(5<mx&&mx<80&&5<my&&my<25){//ヘルプボタン上でマウスをクリックするとヘルプウィンドウの開閉が切り替わる。
if(helpwindow==true){
helpwindow=false;
}
else{
helpwindow=true;
}
repaint();
}
}
public void mouseReleased(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void clearYuki(){
serifu="今夜も徹夜か...";
YukiArray.clear();
YukiColor=Color.white;
repaint();
}
public void colorYuki(){
int red,green,blue;
red=r.nextInt(254)+1;
green=r.nextInt(254)+1;
blue=r.nextInt(254)+1;
YukiColor=new Color(red,green,blue);
repaint();
}
public void whiteYuki(){
YukiColor=Color.white;
repaint();
}
}
public class Kadai1209 extends Applet implements ActionListener{
Button clearButton,colorButton,whiteButton;
TextField textField;
Canvas1202 mycanvas;
public void init(){
Panel p1=new Panel();
p1.setLayout(new FlowLayout());
p1.add(colorButton=new Button("雪の色変更"));
colorButton.addActionListener(this);
p1.add(whiteButton=new Button("色クリア"));
whiteButton.addActionListener(this);
p1.add(clearButton=new Button("クリア"));
clearButton.addActionListener(this);
p1.add(textField=new TextField("今夜も徹夜か...",11));
textField.addActionListener(this);
setLayout(new BorderLayout());
add(mycanvas=new Canvas1202(),"North");
add(p1,"South");
mycanvas.image=getImage(getDocumentBase(),"setsumei2.gif");//ヘルプ用の画像をロードする。
setSize(600,540);
setVisible(true);
}
public void actionPerformed(ActionEvent e){
System.out.println(e);
Object source=e.getSource();
if(source.equals(clearButton)){
mycanvas.clearYuki();
}
else if(source.equals(colorButton)){
mycanvas.colorYuki();
}
else if(source.equals(whiteButton)){
mycanvas.whiteYuki();
}
else if(source instanceof TextField){//入力文字数によっては雪ダルマが怒る。
mycanvas.serifu=e.getActionCommand();
if(mycanvas.serifu.length()>9){
mycanvas.serifu="セリフ長いよ!";
}
else if(mycanvas.serifu.length()==0){
mycanvas.serifu="何か入れろよ!";
}
mycanvas.repaint();
}
}
}
[アプレット]
ソースプログラム(Kadai1209.java)