2012-07-23 3 views
4

Я знаю, как держать мышь (мой g.draw (mouseX, мышиный) курсор) в Ellipse2D/Shape ...Держите мышь в Ellipse2D

@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: Извините за любые ответы конце, модемного интернета :(в настоящее время на

+0

Не уверены в каких-либо «правилах», которые вы нарушили, но 1+ для правильного размещения кода в своем первом сообщении. Сказав это, я бы не хотел использовать ваше приложение и найти себя ограниченным. –

+0

Игра - это своего рода «шутер», и я только хочу, чтобы игроки перекрестились, чтобы пройти через Эллипс. Спасибо за ответ! –

+0

Возможно, тогда все, что вы хотите сделать, это установить изображение курсора на перекрестие, когда оно расположено внутри эллипса? О, и добро пожаловать в stackoverflow! –

ответ

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. 
    } 
} 

Edit: Хорошо, попробуйте это вместо этого:

@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()); 
    } 
} 
+0

Не совсем то, что я собирался, но спасибо за то, что дал мне голову о «Роботе»! –

+0

@AtlasWegman Что именно вы искали? Это удерживает мышь внутри эллипса. – ikdc

+0

Это действительно так, у меня не было проблем с этим. Моя проблема заключалась в том, чтобы держать курсор внутри эллипса даже тогда, когда мышь отсутствует, позволяя курсору имитировать действия мыши, оставаясь внутри эллипса. –

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(); 
     } 
     }); 
    } 
} 
+0

Интересно, хотя не совсем то, что я собирался. Для моих целей мне нужно, чтобы перекрестие всегда оставалось видимым и подвижным, независимо от положения мыши, но все же оставалось только внутри эллипса. Это имеет смысл ... вообще: P Спасибо за код! –

Смежные вопросы