Javaアプレットでマウス位置を取得して線を描画する方法

このQ&Aのポイント
  • Javaアプレットを使ってマウスの位置を取得し、線を描画する方法を教えてください。
  • マウスをクリックした位置を始点とし、もう一度クリックした位置まで線を引くアプレットを作成したいと思っています。
  • 現在のコードでは、マウスをクリックすると点が移動するだけで線が描画されません。x1=x2;y1=y2;がrepaint();よりも前に実行されるためだと思われます。どのように修正すれば良いでしょうか?
回答を見る
  • ベストアンサー

javaアプレット

javaアプレットの勉強をしているのですが、教えてください。 マウスを押すと位置を取得して、線を描くアプレットをつくってみたいと思っています。 一回目に押した位置を始点として、二回目の位置まで線を引きます。このとき、二回目にマウスを押したときにはじめて線を描画するとします。その後、三回目、四回目とマウスを押していくと、前に押した位置を始点として線を引くようなアプレットです。 そこで以下のようにコードを書いて実行してみました。(部分) public void mousePressed(MouseEvent e) { n=n+1; if(n==1){ x1=e.getX(); y1=e.getY();} else{ x2=e.getX(); y2=e.getY(); repaint(); x1=x2; y1=y2; } } public void paint(Graphics g) { g.drawLine(x1,y1,x2,y2); } ところが、実行してみると、マウスを押す位置に点が移動するだけでした。おそらく、コード中のx1=x2;y1=y2;がrepaint();より前に実行されてしまうのではないかと思います。どう書き直せばいいのでしょうか?また、どうしてrepaint();より前に実行されてしまうのでしょうか?

  • koun
  • お礼率37% (81/216)
  • Java
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.1

もちろんrepaint()がx1=x2;y1=y2;より先に実行されている。 ただComponentクラスのrepaintメソッドのAPIドキュメントによれば、 repaint()はpaintまたはupdateメソッドを「可能なかぎりすみやかに」呼び出します、とある。 つまり、repaint()は再描画を指示するだけ、つまり描画の予約をするだけで、 実際に再描画がいつ行われるかは(できるだけ早くやろうとはするだろうが)わからない。 したがって、質問者のコードだと再描画を指示した直後にx1とy2をx2,y2と等しくしてしまっているので、 その後実際にpaintが呼ばれて再描画が行われる時点では点しか描画されない。 この場合、問題点は、マウスを押した時にその時点での再描画のために必要なx2,y2の取得と、 「次に」マウスが押された時に必要になるx1,y1の値の設定を一緒に行っていることにある。 したがって、マウスが押されるたびに、その時の線の描画に必要なx1,y1,x2,y2を設定してから再描画を指示すればいい。 x1,y1は前回押されたときのx2,y2の値であるから、2回目以降においてx2,y2を更新する前にx1,y1にこれを代入すればいい。 そして1回目はx1,y1を更新するのでなく2回目以降でx1,y1として使うためのx2,y2を更新すればいい。 public void mousePressed(MouseEvent e) { n = n + 1; if (n == 1) { x2 = e.getX(); y2 = e.getY(); } else { x1 = x2; y1 = y2; x2 = e.getX(); y2 = e.getY(); repaint(); } } もう少しまとめられると思うがこのような感じで書けると思う。 ところで、これだとマウスを押すたびに新たな座標に対する線しかメモリーに残らないので、 もし描いた線を全部保存したいなら点の座標を記録して再描画のたびに全部の線を描くか、 オフスクリーンバッファに描画しておきそれを再描画のたびにコピーするかすればいい。

koun
質問者

お礼

ありがとうございます。実行したらできました。repaint();はいつ実行されるかわからないんですね。線を全部保存するのもやってみようと思います。

関連するQ&A

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

    【アプレット】マウスイベントについて 現在、マウスに円をリンクさせています 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){ } }); } }

  • 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
  • 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
  • アプレットでマウスイベントが出ない

    クリックしても反応しません。 また、マウスイベントが発生したときに飛ぶメソッドに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アプレットを使って 「徐々に大きな四角形を表示させ、ある程度の大きさの四角形になったらまた最初に戻り、さらにボタンを表示させ、ボタンを押す度に四角形の拡大をストップ、スタートさせるプログラムを作れ。また、マウスでクリックした部分を中心に、徐々に大きな四角形を表示させるようにもするように。」 という、自分でも書いていて分からなくなりそうな内容の課題が出されまして、先生などのアドバイスを頼りに 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
  • ペイントソフトを作っているのですが・・・

    簡単な絵を書くプログラムを下のようにつくりました。 こんなようなソースが公開されているサイトをご存知のかたは教えていただけないでしょうか?? おねがいします!! import java.awt.*; import java.awt.event.*; public class mouse5 extends Frame implements MouseListener , MouseMotionListener{ //グローバル変数 int x0,y0; Color objectColor = Color.red; //コンストラクタ public mouse5(){ setSize(400,300); //マウスイベント addMouseListener(this); addMouseMotionListener(this); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } //paint public void paint(Graphics g){ } //マウスが押されたら public void mousePressed(MouseEvent e){ //始点の座標 x0 = e.getX(); y0 = e.getY(); } //マウスが放されたら public void mouseReleased(MouseEvent e){ } //マウスがクリックされたら public void mouseClicked(MouseEvent e){ } //マウスが画面に入ったら public void mouseEntered(MouseEvent e){ } //マウスが画面から出たら public void mouseExited(MouseEvent e){ } //マウスがドラックされたら public void mouseDragged(MouseEvent e){ //線を引く Graphics g = getGraphics(); g.drawLine(x0,y0,e.getX(),e.getY()); g.dispose(); //次のために始点を更新 x0 = e.getX(); y0 = e.getY(); } //マウスが動いたら public void mouseMoved(MouseEvent e){ } //main public static void main(String[] args) { Frame w = new mouse5(); w.show(); } }

    • ベストアンサー
    • Java
  • またまたすいません、Javaについて質問です

    閲覧ありがとうございます。 現在Javaで簡単なお絵描きソフトを作成しているのですが、ResetButtonを押すと 画面をクリアしたいのですが、ResetButtonを押すと画面はクリアしますが、何故か 左上にResetButtonが描画されてしまいます・・・何故でしょうか? ソースは以下の通りです。(また文字数制限に引っかかったので、一部省略してかいてあります。) import java.awt.event.*; import java.awt.*; import javax.swing.*; /*+++ メインクラス +++*/ public class java_test_04 extends JFrame implements ActionListener { int x1, y1; //描画始点 int x2, y2; //描画次点 MyPanel mp = new MyPanel(); //マイパネルを作成 JButton resetButton = new JButton("Reset"); //リセットボタンを作成 Dimension size; public static void main(String[] args) { new java_test_04(); } public java_test_04() { setLayout(null); setTitle("お絵かき"); //フレームタイトルを設定 setSize(400, 400); //フレームサイズを設定 /*+++ リセットボタンの設定 +++*/ resetButton.setBounds(0, 300, 70, 25); //リセットボタンの表示座標・サイズを設定 resetButton.addActionListener(this); //リセットボタンにアクションイベントを追加 getContentPane().add(resetButton); //リセットボタンを追加 /*+++ マイパネルの設定 +++*/ size = Toolkit. getDefaultToolkit(). getScreenSize(); //フレームのサイズを取得 mp.setBackground(Color.red); //マイパネルの背景色を青に mp.setBounds(0, 0, size.width, 250); //マイパネルの表示座標・サイズを設定 getContentPane().add(mp); //マイパネルを追加 setVisible(true); //フレームを表示 setDefaultCloseOperation(EXIT_ON_CLOSE); //クローズ処理 } @Override public void actionPerformed(ActionEvent arg0) { if (resetButton == arg0.getSource()) { //リセットボタンが押されたら mp.repaint(); //グラフィックをリセット try { Thread.sleep(100); } catch(Exception ex) { System.out.println("[ERR!]" + ex); } } } /*+++ マイパネルクラス +++*/ class MyPanel extends JPanel implements MouseListener,MouseMotionListener{ private static final long serialVersionUID = 1L; MyPanel() { addMouseMotionListener(this); //マウスモーションイベントを追加 addMouseListener(this); //マウスイベントを追加 } /*+++ マウスを押したとき +++*/ public void mousePressed(MouseEvent e) { e.consume(); x1 = x2 = e.getX(); y1 = y2 = e.getY(); paintComponent(getGraphics()); } /*+++ マウスをドラッグしているとき +++*/ public void mouseDragged(MouseEvent e) { e.consume(); x2 = e.getX(); y2 = e.getY(); paintComponent(getGraphics()); //描画 x1 = e.getX(); //これが新たな y1 = e.getY(); //始点となる } /*+++ マウスが動いているとき +++*/ public void mouseMoved(MouseEvent e) { } /*+++ マウスボタンが離されたとき +++*/ public void mouseReleased(MouseEvent e) { } /*+++ マウスがフレーム内に入ったとき +++*/ public void mouseEntered(MouseEvent e) { } /*+++ マウスがフレーム外に出たとき +++*/ public void mouseExited(MouseEvent e) { } /*+++ マウスがクリックされたとき +++*/ public void mouseClicked(MouseEvent e) { } /*+++ ペイントメソッド +++*/ public void paintComponent(Graphics g) { g.drawLine(x1, y1, x2, y2); } } }

    • ベストアンサー
    • 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のアプレットでの質問です。 MouseListenerのマウスクリック時の動作についてですが、 ----------------------------------------------- public void mouseClicked(Event e){   (1)~   (2)~ } ----------------------------------------------- において、奇数クリック時に(1)を実行、偶数クリック時に(2)を実行するというように分岐させることはできるのでしょうか? if(e.getClickCount()%2!=0)で奇数回クリックとして、elseで偶数回クリックとしようとしたのですが、ClickCountの間隔的な問題なのかうまく動作できませんでした。 何かこうすれば良いという案があれば、教えていただけないでしょうか?

    • ベストアンサー
    • Java
  • アプレットで簡単な絵を描きたい

    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