2012-01-03 6 views
3

このコードを実行するには、画面上の赤いボールを押してドラッグすると、マウスカーソルで移動したいので、このコードは仕事をし、部分的にはSunコードから取得されますそれは効率的だと思われますが、マウスをあまりに速く動かすと、マウスのドレーンが止まります。GUIのMouseDragging

どのように私はこれを克服するのですか?

public class SwingPaintDemo3 { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() { 
     JFrame f = new JFrame("Swing Paint Demo"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new MyPanel()); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 

class MyPanel extends JPanel { 

    private int X = 0; 
    private int Y = 0; 
    private int R = 20; 


     public MyPanel() { 

     addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       if ((X<=e.getX() && X+R>=e.getX()) && (Y<=e.getY() && Y+R>=e.getY())) moveVertex(e.getX(),e.getY()); 
      } 
     }); 

     addMouseMotionListener(new MouseAdapter() { 
      public void mouseDragged(MouseEvent e) { 
       if ((X<=e.getX() && X+R>=e.getX()) && (Y<=e.getY() && Y+R>=e.getY())) moveVertex(e.getX(),e.getY()); 
      } 
     }); 

    } 

    private void moveVertex(int x, int y) { 
     int OFFSET = 1; 
     if ((X!=x) || (Y!=y)) { 
      repaint(X,Y,R+OFFSET,R+OFFSET); 
      X=x-10; 
      Y=y-10; 
      repaint(X,Y,R+OFFSET,R+OFFSET); 
     } 
    } 


    public Dimension getPreferredSize() { 
     return new Dimension(250,200); 
    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g);  
     g.drawString("This is my custom Panel!",10,20); 
     g.setColor(Color.RED); 
     g.fillOval(X,Y,R,R); 
     g.setColor(Color.BLACK); 
     g.drawOval(X,Y,R,R); 
    } 
} 

答えて

4

、この問題が発生します。だからあなたは、円の中心にマウスポインタを持っていると言うが、いくつかの方向では本当に速く動くので、mouseDraggedイベントは、マウスが円領域の外にあるときにのみ発動されるので、マウスポインタは " "もう、もう。

この問題の解決方法は、mouseButtonステータスでブール変数を使用することです。円内でマウスをクリックすると、マウスをどこにでも置くことができます。男がマウスボタンを離すとマウスが動きます。

class MyPanel extends JPanel { 
     ... 
     private boolean holdedInsideCircle = false; 


      public MyPanel() { 

       addMouseListener(new MouseAdapter() { 
        public void mousePressed(MouseEvent e) { 
        if ((X<=e.getX() && X+R>=e.getX()) && (Y<=e.getY() && Y+R>=e.getY())) 
         moveVertex(e.getX(),e.getY()); 
         holdedInsideCircle = true; 
        } 
        @Override 
        public void mouseReleased(MouseEvent e) { 
         //Doesn't matter where, if the mouse button is released 
         holdedInsideCircle = false; 
        } 
       }); 


       addMouseMotionListener(new MouseAdapter() { 
        public void mouseDragged(MouseEvent e) { 
         //if ((X<=e.getX() && X+R>=e.getX()) && (Y<=e.getY() && Y+R>=e.getY())) 
         if(holdedInsideCircle) 
          moveVertex(e.getX(),e.getY()); 
        } 
       }); 

     } 
4

この変形を試してください。イベントハンドラJavaのスレッドが十分に速くあなたが速すぎて、マウスを移動すると、mouseDraggedイベントを処理することはないので、

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class SwingPaintDemo3 { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() { 
     JFrame f = new JFrame("Swing Paint Demo"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new MyPanel()); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 

class MyPanel extends JPanel { 

    private int X = 0; 
    private int Y = 0; 
    private int R = 20; 
    private boolean isDrag = false; 

    public MyPanel() { 
     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       if ((X<=e.getX() && X+R>=e.getX()) && (Y<=e.getY() && Y+R>=e.getY())) { 
        moveVertex(e.getX(),e.getY()); 
        isDrag = true; 
       } 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       isDrag = false; 
      } 
     }); 

     addMouseMotionListener(new MouseAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       if (isDrag) moveVertex(e.getX(),e.getY()); 
      } 
     }); 
    } 

    private void moveVertex(int x, int y) { 
     int OFFSET = 1; 
     if ((X!=x) || (Y!=y)) { 
      repaint(X,Y,R+OFFSET,R+OFFSET); 
      X=x-10; 
      Y=y-10; 
      repaint(X,Y,R+OFFSET,R+OFFSET); 
     } 
    } 

    public Dimension getPreferredSize() { 
     return new Dimension(250,200); 
    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawString("This is my custom Panel!",10,20); 
     g.setColor(Color.RED); 
     g.fillOval(X,Y,R,R); 
     g.setColor(Color.BLACK); 
     g.drawOval(X,Y,R,R); 
    } 
} 
+0

ありがとう、何が問題でしたか? –

+0

マウスドラッグメソッドの制約チェックは、マウスの動きに追いつくことができませんでした。 ;) –