MouseListener MouseDragged не работает должным образом

У меня есть сетка, в которой поля становятся красными (в основном я хочу нарисовать сетку), когда я щелкаю левой кнопкой мыши, удерживаю и перемещаю курсор на них (т.е. перетаскиваю мышь). У меня есть код ниже. Когда я делаю перетаскивание мышью. Метод 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);
        }
    }
}

person Cemre Mengü    schedule 28.01.2012    source источник
comment
Вам просто нужно отслеживать положение, а затем установить красный флажок в сетке, на котором находится мышь. Я предполагаю, что он принимает только исходное положение мыши, когда вы щелкаете мышью, а не обновленное положение мыши, когда левая кнопка мыши удерживается нажатой.   -  person theDazzler    schedule 28.01.2012
comment
Хм, это верное замечание. Спасибо. Любые советы о том, как я могу это сделать? то есть отслеживать положение мыши?   -  person Cemre Mengü    schedule 28.01.2012
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 28.01.2012


Ответы (2)


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

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);
  }
person theDazzler    schedule 28.01.2012

Я думаю, что ваша проблема связана с тем, что вы перетаскиваете мышь по нескольким панелям JPanel, и из-за того, как 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

person CodeBlind    schedule 30.01.2012