長方形をドラッグするJavaアップレット

このQ&Aのポイント
  • Javaアップレットについてです。長方形の内部でドラッグすることで、長方形を移動できるプログラムを作成したい。
  • 長方形の内部でマウスボタンを押し、マウスを移動すると、長方形が移動して表示される。
  • マウスボタンを離すと、長方形がその位置に描かれる。また、長方形を持ち上げている感じを出すために、影を描く。
回答を見る
  • ベストアンサー

長方形をドラッグするJavaアップレット

Javaアップレットについてです。長方形の内部でドラッグすることで、長方形を移動できるプログラ厶を作りたいのですが、うまくいきません。どうしても分からないので、改善点がありましたらアドバイスをお願いします。 詳しい仕様は、 ・長方形の内部でマウスボタンを押し、マウスボタンを押したままマウスを移動すると、移動した量だけ長方形を移動して表示する。 ・マウスボタンを離すと、その位置に長方形を描く。 ・長方形を持ち上げている感じを出すために、マウスボタンを押したときとドラッグ中は、長方形を正確な位置から少しずらして表示し、その下に影を描く。 です。 プログラ厶は以下のとおり import java.awt.*; import java.applet.*; import java.awt.event.*; public class ex1118 extends Applet implements MouseListener, MouseMotionListener{ //長方形の最初の位置 Rectangle r1 = new Rectangle(80,100,80,60); //マウスボタンを押した位置 Point p1; //マウスボタンを離した位置 Point p2; //長方形の内部にあるかどうか boolean enter = false; public void init(){ addMouseListener(this); addMouseMotionListener(this); } public void paint(Graphics g){ g.fillRect(r1.x, r1.y, r1.width, r1.height); if(enter){ //影をつける g.setColor(Color.gray); g.fillRect(p1.x, p1.y, r1.width, r1.height); //少しずらす g.setColor(Color.black); g.fillRect(p1.x - 10, p1.y - 10, r1.width, r1.height); } else if(!enter){ r1.x = r1.x + (p2.x - p1.x); r1.y = r1.y + (p2.y - p1.y); g.fillRect(r1.x, r1.y, r1.width, r1.height); } } public void mousePressed(MouseEvent e){ enter = r1.contains(e.getPoint()); if(enter) p1 = e.getPoint(); p2 = null; repaint(); } public void mouseDragged(MouseEvent e){ if(enter) p2 = e.getPoint(); repaint(); } public void mouseReleased(MouseEvent e){ enter = false; p2 = e.getPoint(); repaint(); } public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseMoved(MouseEvent e){} }

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

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

めんどくさいので「長方形が2つ出てしまう」ことについてヒントだけ: 「長方形が 2つ出る」ってことは, 当然だけどプログラム中で「2つ (以上) 描いている」ってこと. 「長方形の内部をクリック」したときに ・それぞれのフィールドの値がどのようになるのか ・プログラムの実行の流れはどうなるのか を考えてみてください.

buzzard2415
質問者

お礼

「長方形が 2つ出る」ところについて、改善できました。 ありがとうございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

なにがどう「うまくいかない」んでしょうか?

buzzard2415
質問者

補足

・1度長方形内部で何か動作をすると、それ以降長方形が2つ出てしまう。 ・長方形外部でクリックやマウスボタンを押したりドラッグすると、長方形が移動してしまう。 ・しばらく操作していると、長方形が左または上に行って消えてしまう。 ・ドラッグ操作が滑らかでない。 などです。 とにかく意図しない方向に移動してしまいます。

関連するQ&A

  • 長方形を描いて、それを移動させるアップレット

    Javaアップレットについて質問です。マウスをドラッグすると、マウスによって指定した位置に長方形を描き、Shiftキーを押したまま描かれた長方形の内部でドラッグすると、マウスを移動した距離だけ長方形を移動させる、というプログラムを作りたいのですが Shiftキーを押したまま長方形の内部でドラッグすると、描いた長方形が消えてしまいます。 どうしていいかわからないので、改善点がありましたら教えてください。 なお、最初に長方形を描くところはできています。 プログラムは以下のとおり import java.awt.*; import java.applet.*; import java.awt.event.*; public class ex1123 extends Applet implements MouseListener, MouseMotionListener{ //Shiftキーを押しているかどうか boolean isS = false; //マウスが長方形の内部に入っているかどうか boolean enter = false; //長方形 Rectangle r1 = new Rectangle(0,0,0,0); //Shiftキーを押したまま、マウスを押した位置と離した位置 Point p1; Point p2; public void init(){ addMouseListener(this); addMouseMotionListener(this); } public void paint(Graphics g){ if(!r1.isEmpty()){ if(isS){ //マウスが長方形の内部にはいっていたら移動させる if(enter){ //長方形の始点を移動させる r1.x = r1.x + (p2.x - p1.x); r1.y = r1.y + (p2.y - p1.y); g.drawRect(r1.x, r1.y, r1.width, r1.height); } } else{ g.drawRect(r1.x, r1.y, r1.width, r1.height); } } } public void mousePressed(MouseEvent e){ r1.setLocation(e.getPoint()); r1.setSize(0,0); if((e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) == MouseEvent.SHIFT_DOWN_MASK){ isS = true; //マウスが長方形の内部に入っているかどうか enter = r1.contains(e.getPoint()); if(enter){ //p1はマウスを押した位置, p2はnull p1 = e.getPoint(); p2 = null; } } else{ isS = false; } repaint(); } public void mouseDragged(MouseEvent e){ //マウスの位置 1if(enter) p2 = e.getPoint(); //最初に描く長方形のサイズを決める r1.setSize(Math.abs(e.getX() - r1.x), Math.abs(e.getY() - r1.y)); repaint(); } public void mouseReleased(MouseEvent e){ //マウスを離す位置を指定 if(enter) p2 = e.getPoint(); //最初に描く長方形のサイズを決める r1.setSize(Math.abs(e.getX() - r1.x), Math.abs(e.getY() - r1.y)); repaint(); } public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseMoved(MouseEvent e){} }

    • ベストアンサー
    • Java
  • マウスイベント処理

    描いた図形(今の場合は長方形)をドラッグして移動させるプログラムを作りたいのですが、うまくいきません… アドバイスどうかよろしくお願いします。 あと、どうすればマウスイベントを使ったプログラム作成が苦手じゃなくなるのでしょうか。 重ねてアドバイスお願い致します。 以下が私が作ったプログラムです。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class RectMove extends Applet implements MouseListener, MouseMotionListener{ Rectangle r1 = new Rectangle(10, 10, 50, 40); Point p1,p2; public void init(){ addMouseListener(this); addMouseMotionListener(this); } public void paint(Graphics g){ g.drawRect(r1.x, r1.y, r1.width, r1.height); } public void mousePressed(MouseEvent e){ p1 = e.getPoint(); if(!r1.contains(p1)) p1 = null; } public void mouseReleased(MouseEvent e){ if(p1 != null){ p2 = e.getPoint(); r1.translate((p2.x - p1.x), (p2.y - p1.y)); p1 = null; repaint(); } } public void mouseClicked(MouseEvent e){ p1 = null; repaint(); } public void mouseDragged(MouseEvent e){ if(p1 != null){ p2 = e.getPoint(); r1.translate((p2.x - p1.x), (p2.y - p1.x)); p1.setLocation(p2); repaint(); } } public void mouseMoved(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} }

    • ベストアンサー
    • Java
  • 互換性のない型?

    以下のようなプログラムを書いたのですが…。 import java.applet.*; import java.awt.*; import java.awt.event.*; public class okweb extends Applet implements MouseMotionListener{ boolean enter = false; Rectangle r1; Point p1; public void init(){ addMouseMotionListener(this); r1 = getBounds(); } public void paint(Graphics g){ if(p1 != null){ if(enter){ g.drawLine(0, p1.y, r1.width, p1.y); g.drawLine(p1.x ,0, p1.x, r1.height); g.drawString("("+p1.x+", "+p1.y+")", p1.x+10, p1.y-10); } } } public void mouseMoved(MouseEvent e){ enter = r1.contains(e.getPoint()); p1 = e.getPoint(); repaint(); } public void mouseDragged(MouseEvent e){}; } これでコンパイルすると、 okweb.java:29: 互換性のない型 検出値:java.awt.Point 期待値:Point p1 = e.getPoint(); と出るんです。 どうすればいいのでしょうか?

    • ベストアンサー
    • 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アプレット

    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();より前に実行されてしまうのでしょうか?

    • ベストアンサー
    • 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
  • 【アプレット】マウスイベントについて

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

  • アップレットのアクションリスナーが動作しません

     アップレットにアクションリスナーをつけて、アップレットとキャンバスにアクションが来るように 下の様なコードを書いてやりましたがうまく動作しません。どこがまずいのでしょうか、宜しくお願 いします。  ・mouseClickedするとアプレットに四角を書くようにしていますが、最初に表示されてしまいます。  ・mouseEnteredするとキャンバスに四角を書くようにしていますが、最初には表示されず、 mouseEnteredでも四角を書きません。  ・"cs.paint(g);"での書き方が悪いのでしょうか。「gを解決できません」と表示されます。   "paint(g);"としても同じです、"mouseClicked"の中でも同じ書き方ですが、   「gを解決できません」というエラー表示は出ていません。  原因が全く分かりません、どこをどのように修正したら良いのでしょうか、宜しくお願い致します。 ================================================================== import java.applet.Applet; import java.awt.Canvas; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.geom.AffineTransform; public class ActionTest extends Applet implements MouseListener { Canvas cs ; public void init() { this.setBackground(Color.pink); Canvas cs = new Canvas( ) ; cs.setBackground(Color.green); cs.setSize( 100 , 100 ) ; this.add( cs ) ; this.addMouseListener( this ) ; } public void paint(Graphics g) { g.fillRect( 50 , 50 , 10 , 10 ) ; } public void mouseClicked(MouseEvent e) { Graphics g = getGraphics() ; setBackground( Color.cyan ) ; paint(g) ; repaint(); } public void mouseEntered(MouseEvent e) { cs.setBackground( Color.orange ) ; cs.paint(g) ; repaint(); } public void mouseExited(MouseEvent arg0) { } public void mousePressed(MouseEvent arg0) { } public void mouseReleased(MouseEvent arg0) { } } ==================================================================

    • ベストアンサー
    • Java
  • 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

専門家に質問してみよう