4

マウス(g.draw(mouseX、mouseY)カーソル)をEllipse2D/Shape内に保持する方法を知っています…</p>

@Override
public void mouseMoved(MouseEvent e) {
    int x = e.getX(), y = e.getY();
    if(shape.contains(x, y)) {
        mouseMoveX = e.getX();
        mouseMoveY = e.getY();
    }
}

…しかし、これは、マウスがその形状を離れるとき(戻るまで)、動きを完全にロックします。IE実際のカーソルが動き回っていても、同じ位置に留まります。実際のカーソルが外れていても、マウスが楕円の周りを移動できるようにしたいと思います。多くの方はまだ混乱しているかもしれませんが、申し訳ありませんが、さらに説明が必要な場合は、喜んで義務付けます。また、ここでの最初の質問ですので、ルールに違反した場合はお知らせください。ありがとう。

PS:現在ダイヤルアップインターネット上にある応答が遅れてすみません:(

4

2 に答える 2

1

これを行う最も簡単な方法は、java.awt.Robotクラスを使用することです。これにより、マウスとキーボードを直接制御できます。

import java.awt.Robot;

...

Robot robot = new Robot(<your GraphicsDevice>);

...

@Override
public void mouseMoved(MouseEvent e) {
    int x = e.getX(), y = e.getY();
    if(shape.contains(x, y)) {
        mouseMoveX = e.getX();
        mouseMoveY = e.getY();
    }
    else {
        robot.mouseMove(mouseMoveX,mouseMoveY); // Assuming these are the previous coordinates.
    }
}

編集:わかりました、代わりにこれを試してください:

@Override
public void mouseMoved(MouseEvent e) {
    int x = e.getX(), y = e.getY();
    if (shape.contains(x, y)) {
        mouseMoveX = e.getX();
        mouseMoveY = e.getY();
    }
    else {
        // get angle of rotation
        double r = Math.atan2(y-shape.getCenterY(),x-shape.getCenterX());
        mouseMoveX = (int) (shape.getWidth()/2 * Math.cos(r) + shape.getCenterX());
        mouseMoveY = (int) (shape.getHeight()/2 * Math.sin(r) + shape.getCenterY());
    }
}
于 2012-07-23T00:55:35.833 に答える
0

位置に基づいてカーソルを設定する例:

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;

import javax.swing.*;

public class CursorMagic extends JPanel {
   private static final int PREF_W = 600;
   private static final int PREF_H = 400;
   private static final Color ELLIPSE_COLOR = Color.red;
   private static final Color ELLIPSE_FILL_COLOR = Color.pink;
   private static final Stroke ELLIPSE_STROKE = new BasicStroke(3f);
   private Ellipse2D ellipse = new Ellipse2D.Double(PREF_W / 4, PREF_H / 4, PREF_W / 2, PREF_H / 2);

   public CursorMagic() {
      MyMouseAdapter mouseAdapter = new MyMouseAdapter();
      addMouseMotionListener(mouseAdapter);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
      g2.setColor(ELLIPSE_FILL_COLOR);
      g2.fill(ellipse);
      g2.setColor(ELLIPSE_COLOR);
      g2.setStroke(ELLIPSE_STROKE);
      g2.draw(ellipse);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private class MyMouseAdapter extends MouseAdapter {
      @Override
      public void mouseMoved(MouseEvent mEvt) {
         if (ellipse.contains(mEvt.getPoint())) {
            setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
         } else {
            setCursor(null);
         }
      }
   }

   private static void createAndShowGui() {
      CursorMagic mainPanel = new CursorMagic();

      JFrame frame = new JFrame("CursorMagic");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
于 2012-07-23T00:52:17.050 に答える