MouseListener MouseDragged не работает должным образом - PullRequest
0 голосов
/ 28 января 2012

У меня есть сетка, в которой прямоугольники становятся красными (я в основном хочу нарисовать сетку), когда я щелкаю левой кнопкой мыши, удерживаю и перемещаю курсор на них (т.е. перетаскиваю мышь). У меня есть код ниже. Когда я делаю перетаскивание мышью. Метод MouseDragged вызывается правильно, однако только один прямоугольник становится красным, и после перетаскивания ничего не происходит (хотя метод все еще вызывается). Есть идеи ? Надеюсь, мне было ясно. Спасибо

public static class DragListener implements MouseMotionListener
{



    @Override
    public void mouseDragged(MouseEvent me) {


            JPanel current =(JPanel)me.getSource();

            current.setBackground(Color.RED);

    }
  }

Это определение сетки:

public static class GridPane extends JPanel {

    public GridPane(int row, int col) {
        int count = 0 ;
        setLayout(new GridLayout(row, col));
        setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));

        for (int i = 1; i <= (row * col); i++) {

            JPanel lab = new JPanel();

            lab.setEnabled(true);
            lab.setBackground(Color.WHITE);
            lab.setPreferredSize(new Dimension(3, 3));
            lab.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            lab.addMouseMotionListener(new DragListener()); 
            lab.addMouseListener(new ClickListener());
            lab.setName(count+"");
            ++count;

            add(lab);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 31 января 2012

Я думаю, что ваша проблема проистекает из того факта, что вы перетаскиваете мышь через несколько JPanels, и из-за того, как java распознает перетаскивание. Java распознает перетаскивание по следующему алгоритму:

Внутри одного компонента "c":

  1. Мышь нажата внутри "c"
  2. Затем мышь перемещается внутри «c» - это означает перетаскивание внутри «c»

Поскольку ваша мышь в конечном итоге покидает один компонент и вводит второй компонент при нажатии, второй компонент никогда не регистрирует действие mousePressed, поэтому он не думает, что вы перетаскиваете мышь. Я бы порекомендовал сохранить какой-либо флаг, который сообщает вашему GridPane, когда мышь нажимается внутри ЛЮБОГО из ваших «лабораторных» JPanels (mousePressed ()), а затем реализовать метод mouseMoved (), чтобы проверить этот флаг и цвет, если он был установлен. Затем реализуйте mouseReleased (), чтобы вернуть ваш флаг обратно в нормальное состояние, чтобы вы не продолжали окрашивать после прекращения перетаскивания.

Для получения дополнительной информации о движении мыши в Java, перейдите по этой ссылке: http://docs.oracle.com/javase/tutorial/uiswing/events/mousemotionlistener.html

0 голосов
/ 28 января 2012

Вам нужно что-то вроде этого

public MouseMotionEventDemo() {
    addMouseMotionListener(this);
    setVisible(true);
  }

  public void mouseMoved(MouseEvent me) {
    mX = (int) me.getPoint().getX();
    mY = (int) me.getPoint().getY();
    repaint();
  }

  public void mouseDragged(MouseEvent me) {
    mouseMoved(me);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...