java applet で描画したものが消える

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たけし

java applet で描画したものが消える

#1

投稿記事 by たけし » 11年前

javaのappletを使ってペイントソフトを作成しました。
ブラウザで使用してみたところ画面のスクロールやりサイズをすると描画したものが消えてしまいました。
どのように改良したらよいかアドバイスをお願いします。(明日提出しなくてはならないものなので少し急いでいます。)

コード:

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;


public class paint extends Applet implements MouseMotionListener, MouseListener, ActionListener{
    int gx = 0;    //X座標を保持する変数
    int gy = 0;    //Y座標を保持する変数
	int olx1,olx2,oly1,oly2;
	
    int c =0; //出力する色の種類を保持する変数
	boolean erase = false;
	boolean pen = true;
	boolean oval = false;
	boolean line = false;
	Graphics Grp;


	Color colors[] = {Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green,
	                  Color.lightGray, Color.magenta, Color.orange, Color.pink, Color.red, Color.white, Color.yellow};
    int deltax = 260/colors.length;
	public void init(){
		Button er = new Button("けしごむ");
		Button pen = new Button("ぺん");
		Button oval = new Button("円");
		Button line = new Button("直線");
		Button reset = new Button("リセット");
		add(er);
		add(pen);
		add(oval);
		add(line);
		add(reset);
        Grp = getGraphics();
        addMouseMotionListener(this);
   		addMouseListener(this);
		er.addActionListener(this);
		pen.addActionListener(this);
		oval.addActionListener(this);
		reset.addActionListener(this);
		line.addActionListener(this);
    }
	
	public void paint(Graphics g) {
		for(int i = 0; i < colors.length; i++){
			g.setColor(colors[i]);
			g.fillRect(i * deltax, 0, deltax, deltax);
		}
	}
	
	public void actionPerformed(ActionEvent e) {
		String cmdName=e.getActionCommand();
		if("リセット".equals(cmdName)){
			repaint();
		}
		
		if ("ぺん".equals(cmdName) && !pen) {
			this.erase = false;
			this.pen = true;
			this.oval = false;
			this.line = false;
		}
		else if("けしごむ".equals(cmdName) && !erase) {
			this.erase = true;
			this.pen = false;
			this.oval = false;
			this.line = false;
		}
		else if("円".equals(cmdName) && !oval) {
			this.oval = true;
			this.pen = false;
			this.erase = false;
			this.line = false;
		}
		else if("直線".equals(cmdName) && !line) {
			this.line = true;
			this.pen = false;
			this.erase = false;
			this.oval = false;
		}
	}
	
	public void mouseDragged(MouseEvent e) {
		//マウスドラック時に、画面に出力
		if(gx>260 || gy>deltax){
			if(erase){
				Grp.setColor(colors[11]);
				Grp.fillRect(gx,gy,deltax,deltax);
			}
			else if(pen){				
			Grp.setColor(colors[c]);
			Grp.drawLine(gx,gy,e.getX(),e.getY());
			}
		}
		gx = e.getX();
		gy = e.getY();
	}
	public void mouseClicked(MouseEvent e){
		for(int i = 0; i < colors.length; i++){
			if(gx > i*deltax && gx<(i+1)*deltax && gy>0 && gy<deltax) c=i;
		}
		gx = e.getX();
		gy = e.getY();
	}
	
	public void mouseMoved(MouseEvent e) {
       //現在のマウス座標保持
		gx = e.getX();
		gy = e.getY();
	}
	public void mouseEntered(MouseEvent e) {
		gx = e.getX();
		gy = e.getY();
	}

  	public void mouseExited(MouseEvent e) {
  		gx = e.getX();
		gy = e.getY();
  	}

  	public void mousePressed(MouseEvent e) {
		if(oval || line){
			olx1=gx;
			oly1=gy;
		}
		gx = e.getX();
		gy = e.getY();
	}

  	public void mouseReleased(MouseEvent e) {
  		Grp.setColor(colors[c]);					
		if(oval){
			olx2=gx-olx1;
			oly2=gy-oly1;
			int a = olx2*(-1);
			int b = oly2*(-1);
			if(gx>260 || gy>deltax){
				if(olx2>0 && oly2>0){
					Grp.drawOval(olx1,oly1,olx2,oly2);
				}
				else if(olx2<0 && oly2>0){
					Grp.drawOval(olx1-a,oly1,a,oly2);
				}
				else if(olx2>0 && oly2<0){
					Grp.drawOval(olx1,oly1-b,olx2,b);
				}
				else{
					Grp.drawOval(olx1-a,oly1-b,a,b);
				}
			}
		}
		if(line){
			olx2=gx;
			oly2=gy;
			Grp.setColor(colors[c]);
			if(gx>260 || gy>deltax){
				if(olx2>0 && oly2>0){
					Grp.drawLine(olx1,oly1,olx2,oly2);
				}
				else if(olx2<0 && oly2>0){
					Grp.drawLine(olx1,oly1,olx2,oly2);
				}
				else if(olx2>0 && oly2<0){
					Grp.drawLine(olx1,oly1,olx2,oly2);
				}
				else{
					Grp.drawLine(olx1,oly1,olx2,oly2);
				}
			}
		}
		gx = e.getX();
		gy = e.getY();
	}
}


よろしくお願いします。

アバター
ookami
記事: 214
登録日時: 14年前
住所: 東京都

Re: java applet で描画したものが消える

#2

投稿記事 by ookami » 11年前

私自身はアプレットあまり詳しくないのですが、お急ぎとのことなので、
http://www.javaroad.jp/bbs/answer.jsp?q ... 7232856460
> getGraphicsから得たGraphicsオブジェクトを描画に使ってはいけない
というのが見つかりました。手がかりになるでしょうか?

ISLe()

Re: java applet で描画したものが消える

#3

投稿記事 by ISLe() » 11年前

アプレットやコンポーネントの表面は揮発性なので再描画しないと消えます。

オフスクリーン用のイメージを用意してそこへ描画し、アプレットの再描画ではオフスクリーンイメージを描画することで消えなくなります。

33行目を
offimg = createImage(getWidth(), getHeight()); // 画面サイズでオフスクリーン用イメージを作成
Grp = offimg.getGraphics(); // オフスクリーン用イメージのGraphics
と変更してください。

16行目のあとに
Image offimg;
を追加。

paintメソッドにoffimgを描画するコードを追加してください。
各描画操作後に再描画を要求するrepaintの呼び出しが必要です。

リセット機能はオフスクリーン用イメージを塗り潰すように変更してください。

カラーパレットの点滅が気になるようでしたら工夫してください。
この仕様ならカラーパレットをオフスクリーン用イメージに常に上書きして良いかと思います。

たけし

Re: java applet で描画したものが消える

#4

投稿記事 by たけし » 11年前

返信ありがとうございます。
オフスクリーンイメージを用意する方法で描画が消えなくなりました。
本当に助かりました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る