пошаговое перемещение курсора - PullRequest
2 голосов
/ 26 января 2012

У меня есть приложение java swing для шахмат. Курсор имеет пользовательский вид - прямоугольник, размер которого соответствует целой ячейке. И мне нужно, чтобы курсор двигался только по всей ячейке. Не в пределах одной клетки. Есть ли типичные решения для этой проблемы? Или, может быть, можно установить стандартные возможности java для перемещения курсора типа шага?

enter image description here

1 Ответ

6 голосов
/ 26 января 2012

Я бы не стал реализовывать какой-то "пошаговый" курсор. Вместо этого я бы полностью скрыл курсор и программно выделил текущую ячейку.

  • Скрывая курсор, проверьте этот вопрос и ответ .
  • Используйте MouseMotionListener , чтобы получить движения мыши (и выделите ее в методе paintComponent вашего пользовательского компонента

Полный пример ниже, который "выводит" этот скриншот:

screenshot

public class StepComponent extends JComponent implements MouseMotionListener {
    private Point point = new Point(0, 0);

    public StepComponent() {
        setCursor(Toolkit.getDefaultToolkit().createCustomCursor(
                new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB), 
                new Point(0, 0), "blank cursor"));
        addMouseMotionListener(this);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        int x = 0, y = 0;
        while (x < getWidth()) { g.drawLine(x, 0, x, getHeight()); x += 10; }
        while (y < getHeight()) { g.drawLine(0, y, getWidth(), y); y += 10; }
        if (point != null)
            g.fillRect(point.x, point.y, 10, 10);
    }
    @Override public void mouseDragged(MouseEvent e) { update(e.getPoint()); }
    @Override public void mouseMoved(MouseEvent e) { update(e.getPoint()); }

    private void update(Point p) {
        Point point = new Point(10 * (p.x / 10), 10 * (p.y / 10));
        if (!this.point.equals(point)) {
            Rectangle changed = new Rectangle(this.point,new Dimension(10,10));
            this.point = point;
            changed.add(new Rectangle(this.point, new Dimension(10, 10)));
            repaint(changed);
        }
    }
}

И тестовый код:

public static void main(String[] args) {

    JFrame frame = new JFrame("Test");

    frame.add(new StepComponent());

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 300);
    frame.setVisible(true);
}
...