アプレットで簡単な絵を描きたい

このQ&Aのポイント
  • drawLineメソッドを使用してマウスで絵を描きたいのですがうまくいきません。
  • どうすればいいでしょうか?
  • 一応私が途中まで考えたソースを下に載せておきます。できればこのソースを変更して完成できればよく理解できるのでよろしくお願い致します。
回答を見る
  • ベストアンサー

アプレットで簡単な絵を描きたい

drawLineメソッドを使用してマウスで絵を描きたいのですがうまくいきません。どうすればいいでしょうか? 一応私が途中まで考えたソースを下に載せておきます。 できればこのソースを変更して完成できればよく理解できるのでよろしくお願い致します。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class MyGraphics2 extends Applet implements MouseListener{ private int startX; private int startY; private int startX2; private int startY2; private boolean flg; public void init(){ addMouseListener(this); } public void mouseClicked(MouseEvent e){ } public void mousePressed(MouseEvent e){ flg = true; startX = e.getX(); startY = e.getY(); } public void mouseReleased(MouseEvent e){ flg = false; } public void mouseMoved(MouseEvent e){ System.out.println(flg); if(flg == true){ System.out.println(flg); startX2 = e.getX(); startY2 = e.getY(); repaint(); startX = e.getX(); startY = e.getY(); } } public void mouseEntered(MouseEvent e){} public void update(Graphics e){ e.drawLine(startX, startY,startX2, startY2); } public void mouseExited(MouseEvent e){} }

  • Java
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.3

 #1です。 >それと、私が最初drawLineを使用して線の描画を行おうと >しましたがそれでは無理なのでしょうか? >一応VB.NETではdrawLineを使用して絵を描いたの >でできるかと思いまして。  VB.netのことはよくわからないのですが、昔のVBではフォームのlineメソッドとかでやっていたような気がします。  今思えば、こういったことをフォームが内部的にやってくれていたということでしょうね。  とにかく、Javaのコンポーネントのpaintメソッドでは全部を描かないといけないので、何らかの方法で、今まで描いてきた絵を覚えておく必要があります。  オフスクリーンバッファを使わない方法も考えてみました。  今まで描いてきた履歴をLineオブジェクトDrawnStringオブジェクトとして記憶し、paintメソッドで一気に書くという方法です。  これだと、拡大や縮小にも対応できますし、Undoも簡単です。 import java.awt.*; import java.applet.*; import java.awt.event.*; import java.util.*; public class MyGraphics4 extends Applet implements ActionListener, MouseListener, MouseMotionListener {      //描画要素を保存しておくVector   Vector drawList;   int startX, startY;      //背景を塗りつぶすかつぶさないかのフラグ   boolean isClearBackground = false;      //文字を書くボタン   Button stringButton;      //手前で描いた要素を削除するボタン   Button deleteButton;      public void init(){     setLayout(new FlowLayout());          stringButton = new Button("文字列");     stringButton.addActionListener(new StringButton_Clicked());     add(stringButton);          deleteButton = new Button("削除");     deleteButton.addActionListener(this);     add(deleteButton);          addMouseListener(this);     addMouseMotionListener(this);          drawList = new Vector();        }      public void actionPerformed(ActionEvent e) {     //deleteButtonのイベントハンドラ          //最後の描画要素を削除して     drawList.remove(drawList.size() - 1);     //背景更新モードでrepaint     isClearBackground = true;     repaint();   }      public void mouseClicked(MouseEvent e){}      public void mousePressed(MouseEvent e){     startX = e.getX();     startY = e.getY();   }      public void mouseReleased(MouseEvent e){}      public void mouseEntered(MouseEvent e) {}      public void mouseExited(MouseEvent e) {}      public void mouseMoved(MouseEvent e){}      public void mouseDragged(MouseEvent e) {     int x = e.getX();     int y = e.getY();     //リストに新しい線分を追加     Line line = new Line(startX, startY, x, y);     drawList.add(line);     repaint();     startX = x;     startY = y;   }      public void update(Graphics g) {     if (isClearBackground) {       //背景更新する場合はスーパークラスのupdateを呼ぶ       super.update(g);       isClearBackground = false;     }     else       //そうじゃない場合はそのままpaintにつなぐ。       paint(g);   }      public void paint(Graphics g) {     //すべての要素を描画     for (int i = 0; i < drawList.size(); i++) {       Drawable drawnObject = (Drawable)drawList.get(i);       drawnObject.draw(g);     }          //ボタンを追加したので、これを呼んでおかないと、ボタンが表示されない     super.paint(g);   }      private class StringButton_Clicked implements ActionListener {     //stringButtonのイベントハンドラ     int x = 0;     int y = 30;          public void actionPerformed(ActionEvent e) {       //文字要素をリストに追加       drawList.add(new DrawnString("MyGraphics4の", x, y));       y+=10;       repaint();     }   } } //------------------------- public interface Drawable {   public void draw(java.awt.Graphics g); } //----------------------------- public class Line implements Drawable {   public int x1, y1, x2, y2;      public Line() {};      public Line(int x1, int y1, int x2, int y2) {     this.x1 = x1;     this.y1 = y1;     this.x2 = x2;     this.y2 = y2;   }      public void draw(java.awt.Graphics g) {     g.drawLine(x1, y1, x2, y2);   } } //------------------------------------ public class DrawnString implements Drawable {   public String string;   public int x, y;      public DrawnString() {}      public DrawnString(String string, int x, int y) {     this.string = string;     this.x = x;     this.y = y;   }      public void draw(java.awt.Graphics g) {     if (string != null) {       g.drawString(string, x, y);     }   } }

yukikundesuyo
質問者

お礼

回答ありがとうございます。 ソースを毎回考えていただき申し訳ない限りです。 とりあえず、いろいろなやり方があるんだなということが分かり大変参考になりました。 本当にありがとうございます。

その他の回答 (2)

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.2

 こんばんは、#1です。 >ダブルバッファリングとはどのようなものでしょうか?  うーん、今回のような使い方はダブルバッファリングとは言わないのかも。  ここ↓のページがわかりやすいので、読んでみてください。 http://hp.vector.co.jp/authors/VA012735/java/dbuf1.htm  ちらつき防止のためにあるものですが、今回は描いた絵を覚えておかないといけないので、オフスクリーンバッファに線を描いていき、paintメソッドでdrawImageを使って一気に描画します。 >「"APPLETの"」を起動時に表示させ、それから線を描きたいのですが、 >、「"APPLETの"」が消えてしまいます。どうすればいいでしょうか?  initメソッド内でオフスクリーンバッファに書いておけばよいと思います。 >一応updateメソッドにて線を描きなさいという条件があるので >直させていただきました。(ちゃんと動きます)  なんだか、変な条件ですが、これだと、うまくいかないはずです。  MyGraphics3アプレットを起動してみてください。  適当に線を描き、ブラウザを最小化して、元に戻してみてください。  線が消えてしまうはずです。  そして、再び線を描こうとすると、突然今まで描いた線が現れます。  これは、想定した挙動ではないはずです。  update()はrepaint()によって呼び出されます。  repaint() → update() → paint()  つまり、update()はプログラムの中で明示的にrepaint()を呼ばないと実行されません。  イベント処理スレッドは直接paint()を呼ぶので、updateに描画するコードを書くとシステムによる描画に対応できません。  paintメソッドで描いたほうがいいと思うのですが・・・。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class MyGraphics2 extends Applet implements MouseListener, MouseMotionListener {      //ダブルバッファリング用のイメージ   Image imageBuf;   //そのイメージのグラフィックオブジェクト   Graphics imageBufG;   private int startX;   private int startY;      public void init(){          addMouseListener(this);     addMouseMotionListener(this);          //ダブルバッファリング用のイメージの作成     imageBuf = createImage(getWidth(), getHeight());          //そのグラフィックオブジェクトの取得     imageBufG = imageBuf.getGraphics();     imageBufG.setColor(Color.BLACK);     imageBufG.drawString("APPLETの", 10, 150);   }   public void stop(){}      public void mouseClicked(MouseEvent e){}      public void mousePressed(MouseEvent e){     System.out.println("press");     startX = e.getX();     startY = e.getY();   }      public void mouseReleased(MouseEvent e){}      public void mouseEntered(MouseEvent e) {}      public void mouseExited(MouseEvent e) {}      public void mouseMoved(MouseEvent e){}      public void mouseDragged(MouseEvent e) {     int x = e.getX();     int y = e.getY();     //ダブルバッファリング用のイメージに書き込む     imageBufG.drawLine(startX, startY, x, y);     repaint();     startX = x;     startY = y;   }      public void update(Graphics g) {     paint(g);   }      public void paint(Graphics g) {     g.drawImage(imageBuf, 0, 0, this);   } }

yukikundesuyo
質問者

補足

詳しい回答ありがとうございます。 確かにupdateメソッドに処理を記述すると実行結果が変ですね。ダブルバッファリングのこともよく分かってよかったです。 それと、私が最初drawLineを使用して線の描画を行おうとしましたがそれでは無理なのでしょうか? 一応VB.NETではdrawLineを使用して絵を描いたのでできるかと思いまして。 何度も質問して申し訳ありませんが、回答のほどよろしくお願い致します。

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんばんは。  いろいろ問題点があります。 1.paintメソッドではなく、updateメソッドで描画しようとしている。 2.仮にpaintメソッドで描画していても、ダブルバッファリングができていないので、このままでは、点が移動するだけで、絵にならない。 3.mouseMovedを使っているが、MouseMotionListenerをimplementsしていないため、独自メソッドになってしまっている。 4.addMouseMotionListenerを登録していない。 5.そもそもmouseDraggedを使うべき。  などなどでしょうか。  サンプルを書くとこんな感じです。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class MyGraphics2 extends Applet implements MouseListener, MouseMotionListener {   //ダブルバッファリング用のイメージ   Image imageBuf;   //そのイメージのグラフィックオブジェクト   Graphics imageBufG;      private int startX;   private int startY;         public void init(){     addMouseListener(this);     addMouseMotionListener(this);          //ダブルバッファリング用のイメージの作成     imageBuf = createImage(getWidth(), getHeight());          //そのグラフィックオブジェクトの取得     imageBufG = imageBuf.getGraphics();     imageBufG.setColor(Color.BLACK);   }      public void mouseClicked(MouseEvent e){}      public void mousePressed(MouseEvent e){     System.out.println("press");     startX = e.getX();     startY = e.getY();   }      public void mouseReleased(MouseEvent e){}      public void mouseEntered(MouseEvent e) {}      public void mouseExited(MouseEvent e) {}      public void mouseMoved(MouseEvent e){}      public void mouseDragged(MouseEvent e) {     int x = e.getX();     int y = e.getY();     //ダブルバッファリング用のイメージに書き込む     imageBufG.drawLine(startX, startY, x, y);     repaint();     startX = x;     startY = y;   }      public void update(Graphics g) {     paint(g);   }      public void paint(Graphics g) {     //ダブルバッファリング用のイメージを描画する。     g.drawImage(imageBuf, 0, 0, this);   } }

yukikundesuyo
質問者

お礼

回答ありがとうございます。 ダブルバッファリングとはどのようなものでしょうか? 後もうひとつ要望があるのですが、「"APPLETの"」という文字をアプレット起動時に表示させる処理を追加しました。これが線を描いたときに消えてしまいます。 一応条件としては、「"APPLETの"」を起動時に表示させ、それから線を描きたいのですが、、「"APPLETの"」が消えてしまいます。どうすればいいでしょうか? 一応updateメソッドにて線を描きなさいという条件があるので直させていただきました。(ちゃんと動きます) 回答のほどよろしくお願い致します。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class MyGraphics3 extends Applet implements MouseListener, MouseMotionListener { //ダブルバッファリング用のイメージ Image imageBuf; //そのイメージのグラフィックオブジェクト Graphics imageBufG; private int startX; private int startY; public void init(){ addMouseListener(this); addMouseMotionListener(this); //ダブルバッファリング用のイメージの作成 imageBuf = createImage(getWidth(), getHeight()); //そのグラフィックオブジェクトの取得 imageBufG = imageBuf.getGraphics(); imageBufG.setColor(Color.BLACK); } public void stop(){} public void mouseClicked(MouseEvent e){} public void mousePressed(MouseEvent e){ System.out.println("press"); startX = e.getX(); startY = e.getY(); } public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseMoved(MouseEvent e){} public void mouseDragged(MouseEvent e) { int x = e.getX(); int y = e.getY(); //ダブルバッファリング用のイメージに書き込む imageBufG.drawLine(startX, startY, x, y); repaint(); startX = x; startY = y; } public void update(Graphics g) { g.drawImage(imageBuf, 0, 0, this); } public void paint(Graphics g) { g.drawString("APPLETの", 10, 150); } }

関連するQ&A

  • Javaのアプレットについて質問です。

    星型の図形をアプレットビューワ上でマウスを押した場所に移動させたいのですが・・・ import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; import java.awt.Font; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; import java.awt.Polygon; public class Enshu1_5 extends Applet implements MouseListener { int px []={100,80,10,70,40,100,160,130,190,120}; int py []={10,75,75,113,190,140,190,113,75,75}; private Polygon poly = new Polygon(px,py,10 ); public void init() { addMouseListener(this); } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void paint(Graphics g) { g.setColor(Color.red); g.fillPolygon(poly); g.setFont(new Font("serif",Font.BOLD,24)); g.drawString("Star",100,200); } } こんな感じでつくってみたのですが現在位置とクリック位置との差分割り出し方をpublic void mouseClicked(MouseEvent e)の所に書きたいのですが普通にpoly.translate( e.getX(), e.getY() );をしてしまうと原点からの移動になってしまうため、フィールド上にint x=0,y=0をつくりmouseClickedのところで if(e.getX()>x&&e.getY()>y) { int dx=e.getX()-x; int dy=e.getY()-y; x=dx; y=dy; poly.translate(dx,dy); repaint(); }の様な感じで考えられる条件を条件分岐していこうと思ったのですがどうもうまくいきませんしかなりかさばったものになってしまうと思います。何かいい方法はないでしょうか? 教えて下さい><

    • ベストアンサー
    • Java
  • 【アプレット】マウスイベントについて

    【アプレット】マウスイベントについて 現在、マウスに円をリンクさせています 1回左クリックするとその場所で円が停止し、もう1回左クリックするとまた動きだし、もう1回左クリックするとその場所で円が停止し、・・・の繰り返しを行いたいです なにかアドバイスをください。 作ってるのに近いプログラム ↓ import java.applet.* ; import java.awt.*; import java.awt.event.*; public class test extends Applet { int posX = 50; int posY = 50; public void paint(Graphics g) { g.setColor(Color.red); g.fillOval(posX, posY, 50, 50); } public void mousePressed( MouseEvent e ){ x = e.getX(); y = e.getY(); repaint(); } public void init () { this.setSize(200, 200); this.setVisible(true); addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { posX = e.getX(); posY = e.getY(); repaint(); } public void mousePressed( MouseEvent e ){ x = e.getX(); y = e.getY(); repaint(); } public void mouseReleased(MouseEvent e){ } public void mouseClicked(MouseEvent e){ } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } }); } }

  • アプレットでマウスイベントが出ない

    クリックしても反応しません。 また、マウスイベントが発生したときに飛ぶメソッドにSystem.out.printlnを入れるとException in thread "AWT-EventQueue-0" java.lang.NullPointerException: component argument pDataが出ることがあります。 import java.applet.Applet; import java.awt.Graphics; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; public class NewJApplet extends javax.swing.JApplet implements MouseListener{ int x = 10; int y = 10; public void init() { x = 50; y = 50; } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed( MouseEvent e ){ x = e.getX(); // マウスがクリックされた位置のx座標を取得する y = e.getY(); // マウスがクリックされた位置のy座標を取得する repaint(); // アプレットの再描画を指示する } public void mouseReleased(MouseEvent e) { } public void paint(Graphics g) { g.fillOval(x,y,10,10); } } 使ってるのは jre1.6.0_01 NetBeans 5.5です

    • ベストアンサー
    • Java
  • JAVAのアプレットのアニメーションの質問

    javaのアプレットに関する質問なんですが、今次の条件でアニメーションを作っているんですが、どうしても解決できない問題があります。 赤い長方形が左から右に動いていくプログラムを作成する。 ・ 長方形が描画領域 の右端に消えると左端から再 度出現するようにせよ。 ・ Reverseと書かれたボタンを押すと長方形の進行方 向が左右反対になる。 ・ このとき、左右どちらの端に長方形が消えた場合も 反対端から長方形は出現する。 ・ 長方形をクリック(ボタン押下)すると長方形の色が 変化する。 ・ 赤い長方形であれば青に、青い長方形であれば赤 に変化する。 この条件でつくろうと思っているのですが、長方形をクリックしたときに、色の変化がどうしてもできません。どこに問題があるか分かりません。御教授お願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; import java.awt.Font; import java.awt.Button; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.MouseListener; public class Report2 extends Applet implements Runnable,ActionListener,MouseListener{ int x=100; int y=50; int width=80; int height=120; int dir=-2; int w; int z; Button bt; boolean direction; boolean colorRed; public void actionPerformed(ActionEvent ae){ if(direction==true){ direction=false; } else{ direction=true; } } public void init(){ bt=new Button("Reverse"); add(bt); bt.addActionListener(this); Thread th; th =new Thread(this); th.start(); addMouseListener(this); } public void mouseClicked(MouseEvent e){ w=e.getX(); z=e.getY(); repaint(); if(e.getX()>=x && e.getX()<=x+width && e.getY()>=y && e.getY()<=y+height){ colorRed=!colorRed; } } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } public void mouseReleased(MouseEvent e){ } public void mousePressed(MouseEvent e){ w=e.getX(); z=e.getY(); repaint(); if(e.getX()>=x && e.getX()<=x+width && e.getY()>=y && e.getY()<=y+height){ colorRed=!colorRed; } } public void run() { while(true){ x++; if(x==400){ x=-80; } if(direction==true){ x=x+dir; } else{ } repaint(); try{ Thread.sleep(30); } catch(InterruptedException e){} } } public void paint(Graphics g){ g.setColor(Color.white); g.fillRect(0,0,400,200); g.setColor(Color.red); g.fillRect(x,y,80,120); if(colorRed=true){ g.setColor(Color.red); } if(colorRed=false){ g.setColor(Color.blue); } g.fillRect(x,y,width,height); g.setColor(Color.black); g.fillRect(x,y,10,10); } }

    • ベストアンサー
    • Java
  • java リアルタイムでマウスの座標を取得したい

    マウスのリアルタイム座標を取得したいのですが、 以下のソースを作りました。 しかし、リアルタイムどころか、マウスをクリックしても座標が取得できません どこを修正すればいいのでしょうか? import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.awt.event.MouseEvent; import java.net.URL; import java.awt.Image; /*<applet code="applet001" width="640" height="480"></applet>*/ public class applet001 extends Applet implements MouseListener, MouseMotionListener { Dimension dim; int mouse_x, mouse_y; //アプレットの初期化時呼び出される public void init() { dim = getSize(); addMouseListener( this ); } public void update(Graphics g) //オーバーライドして最低限のことだけをする { paint(g); } public void paint(Graphics g) { g.drawString( "マウス:" + mouse_x + "," + mouse_y, 60, 120 ); g.fillOval(mouse_x,mouse_y,30,30); } // マウスの処理 public void mousePressed( MouseEvent e ) { mouse_x = e.getX(); mouse_y = e.getY(); } public void mouseClicked( MouseEvent e ) {} public void mouseReleased( MouseEvent e ) {} public void mouseEntered( MouseEvent e ) {} public void mouseDragged( MouseEvent e ) {} // public void mouseExited( MouseEvent e ) {} // public void mouseMoved( MouseEvent e ) { mouse_x = e.getX(); mouse_y = e.getY(); repaint(); } }

    • ベストアンサー
    • Java
  • javaアプレットの課題について

    大学の授業の課題についてなんですが、 javaアプレットを使って 「徐々に大きな四角形を表示させ、ある程度の大きさの四角形になったらまた最初に戻り、さらにボタンを表示させ、ボタンを押す度に四角形の拡大をストップ、スタートさせるプログラムを作れ。また、マウスでクリックした部分を中心に、徐々に大きな四角形を表示させるようにもするように。」 という、自分でも書いていて分からなくなりそうな内容の課題が出されまして、先生などのアドバイスを頼りに import java.applet; import java.awt.Graphics; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.Color; import java.awt.Button; public class Report1 extends Applet implements ActionListener,Runnable { int x = 10; int y = 10; Button bt; public void init() { addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { x = e.getX(); y = e.getY(); repaint(); } }); { bt.setLabel("pause"); } while{ } if() repaint(); public void paint(Graphics g) { g.setColor(Color, white); g.fillRect(0, 0, 400, 400); } public void update(Graphics g){ paint(); 何とか上のような感じにまではこぎつけたのですが、 ここからは正直どうすればいいのか検討がつかず お手上げ状態なんです... どなたか解答又は参考になるサイトがあれば 教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • マウスのイベント処理について

    「/home/tatuya/MyDocument/logo.jpg」の画像をドラック・移動できるようにしたいのですがうまくいきません。 なにがいけないのか教えてください。 できれば手直しして動くようになったプログラムをはってもらえるとさいわいです。 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.imageio.ImageIO; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.Graphics; import java.awt.Image; import java.awt.geom.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class bb extends JFrame{ private int px; private int py; boolean flag=false; Image icon=getToolkit().getImage("/home/tatuya/MyDocument/logo.jpg"); public static void main(String[] args){ bb frame = new bb(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 400, 250); frame.setTitle("タイトル"); frame.setVisible(true); new bb(); } public void paint(Graphics g){ g.drawImage(icon,px,py,this); } public void mouseClicked(MouseEvent e){ /* 処理したい内容をここに記述する */ } public void mouseEntered(MouseEvent e){ /* 処理したい内容をここに記述する */ } public void mouseExited(MouseEvent e){ /* 処理したい内容をここに記述する */ } public void mousePressed(MouseEvent e){ /* 処理したい内容をここに記述する */ if (px<=e.getX() && e.getX()<=px+221 && py<=e.getY() && e.getY()<=py+59) flag=true; repaint(); } public void mouseReleased(MouseEvent e){ /* 処理したい内容をここに記述する */ flag=false; } public void mouseDragged(MouseEvent e){ if (flag){ px=e.getX();py=e.getY(); repaint(); } } public void mouseMoved(MouseEvent e){ } }

  • 画面のちらつきの原因が知りたいです

    JAVAの初心者です、宜しくお願いします。 下のようなプログラムを書きました。 「public void paint(Graphics g){ ~ repaint();」とすると、画像がちらつきます、しかし、「repaint();」を消すとちらつかなくなります、この原因が分かりません。 一体何故このような現象が起こるのでしょうか、宜しくお願いします。 ========================================================== import java.applet.Applet; import java.awt.Button; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class Oval_Rec_1_071128 extends Applet implements MouseListener , ActionListener { int x1 ; int y1 ; int xh = 50 ; int yv = 50 ; Button bt1 ; Button bt2 ; public void actionPerformed(ActionEvent ae){} public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void init() { setBackground(Color.yellow); addMouseListener(this); bt1 = new Button("push"); bt1.setFont(new Font("SansSerif", Font.BOLD, 20)); bt1.setBackground(Color.black); bt1.setForeground(Color.lightGray); add(bt1); bt1.addActionListener(this); bt2 = new Button("change_circle"); add(bt2); bt2.addActionListener(this); } public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); xh = e.getX(); yv = e.getY(); // repaint(); //comment out } public void paint(Graphics g) { g.setColor(Color.red); g.setFont(new Font("Serif",Font.BOLD,24)); g.drawString("Hello Applet World ! !" , 50 , 50); g.setColor(Color.blue); g.drawLine( 100 , 100 , 500 , 500); g.setColor(Color.cyan); g.fillOval( x1 , y1 , xh , yv); g.setColor(Color.magenta); g.fillRect( xh , yv, x1/10 , y1/10 ); repaint(); } }

    • ベストアンサー
    • Java
  • クリックして頂点を線で結ぶ

     マウスでクリックした点から点まで順々に線でつなげる(二回目のクリックで線一本がひける。)プログラムを組んでいるのですが、配列を使う以外の方法を探しています。どなたかいい方法があればご紹介ください。  ちなみに配列を使ったプログラムを以下に載せます。 import java.applet.*; import java.awt.Graphics; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; public class tyouten extends Applet implements MouseListener{ int i=0,j=0; int[] xx=new int[100]; int[] yy=new int[100]; public void init(){ addMouseListener(this); } public void mouseClicked(MouseEvent e){ xx[i]=e.getX(); yy[i]=e.getY(); if(i<99) i++; if(i>0)repaint(); } public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void paint(Graphics g){ for (j=0;j<i-1;++j) g.drawLine(xx[j],yy[j],xx[j+1],yy[j+1]); for(j=0;j<i;++j) g.drawOval(xx[j]-1,yy[j]-1,2,2); } }

    • ベストアンサー
    • Java
  • アプレットが初期化されていません。

    パッケージを使用してプログラムを書いたのですが、タイトルのとおりのメッセージがでます。コンパイルはしっかり通るのですが、どなたかお力をお貸しください。 ちなみに、Report2.html、Report2.javaは以下のとおりです。 <html> <body> <applet code="rep.Report2.class" width="400" height="200"> </applet> </body> </html> package rep; import gol.Goal; import bx.Box; import bx.BoxException; import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; import java.awt.Button; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Report2 extends Applet implements Runnable, ActionListener{ Goal gol; //Boxオブジェクトがはいるゴール Box[] box; Button[] bt; int mxp; //マウスボタン押下時のx座標 int myp; //マウスボタン押下時のy座標 public void init(){ addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent e){ mxp=e.getX(); myp=e.getY(); } public void mouseReleased(MouseEvent e){ int temp=Box.getSum(); if(temp<box.length){ //マウスボタンを離した座標 int mxr=e.getX(); int myr=e.getY(); if(mxp==mxr && myp==myr){ //押すのと離すのが同じ box[temp]=new Box(gol, mxp, myp); } else{ //押すのと離すのが違う int mw=Math.abs(mxp-mxr); int mh=Math.abs(myp-myr); box[temp]=new Box(gol, Math.min(mxp, myr), Math.min(myp, myr), mw, mh); } box[temp].start(); } } }); Goal gol=new Goal(); box=new Box[3]; bt=new Button[2]; bt[0]=new Button("Box"); bt[1]=new Button("small"); for(int i=0; i<bt.length; i++){ add(bt[i]); bt[i].addActionListener(this); } Thread th; th=new Thread(this); th.start(); } public void run(){ while(true){ repaint(); try{ Thread.sleep(50); } catch(InterruptedException e){ } } } public void actionPerformed(ActionEvent ae){ int temp=Box.getSum(); if(ae.getSource()==bt[0]){ if(temp<box.length){ box[temp]=new Box(gol); box[temp].start(); } } else if(ae.getSource()==bt[1]){ for(int i=0; i<temp; i++){ try{ box[i].setHeight(box[i].getHeight()-10); } catch(BoxException e){ System.out.println(e +"が送出されました。"); } } } } public void paint(Graphics g){ g.setColor(Color.red); for(int i=0; i<box.length; i++) if(box[i] !=null) g.fillRect(box[i].getX(), box[i].getY(), box[i].getWidth(), box[i].getHeight()); g.setColor(Color.black); g.drawString("得点" + gol.getScore(), 10, 80); } }

専門家に質問してみよう