MouseDragging все еще стреляет даже после отпускания - PullRequest
0 голосов
/ 06 февраля 2019

Здравствуйте и заранее спасибо,
Я работаю с Graphics2D для игры в казино (рулетка), поэтому я пытаюсь добавить движение к фишкам казино (Деньги), поэтому для этого я использую MouseDraggedсобытия и в качестве теста я работаю только с одним эллипсом.

код ниже

package roulette;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.swing.JPanel;
import javax.swing.Timer;

public class RouletteInterface extends JPanel{

    private List<Shape> money = new ArrayList<>();


    public RouletteInterface() {

        createEllipseGrap();
    }

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



    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g4d = (Graphics2D) g.create();
        paintEllipseGrap(g4d, g);
        g4d.dispose();
    }

    protected void createEllipseGrap() {
        Ellipse2D elipse = new Ellipse2D.Double(100, 100, 30, 30);
        money.add(elipse);
        addMouseListener(new moneyMouseListener());
        addMouseMotionListener(new moneyMouseListener());
    }

    protected void paintEllipseGrap(Graphics2D g3d, Graphics g) {

        g3d.setColor(Color.BLUE);
        g3d.fill(money.get(0));
    }

    private class moneyMouseListener extends MouseAdapter {
        int dragging;
        private int x;
        private int y;

        @Override
        public void mousePressed(MouseEvent e) {
            if(money.get(0).contains(e.getPoint())) {
                x = e.getX();
                y = e.getY();
                dragging = 0;
            } else {
                return ; 
            }

        }

        @Override
        public void mouseDragged(MouseEvent e) {
            if(dragging == 0) {
            x = e.getX();
            y = e.getY();
            Ellipse2D elipse = new Ellipse2D.Double(x, y, 30, 30);
            money.set(0, elipse);
            repaint();
            } else {

            }
        }

        @Override
        public void mouseReleased(MouseEvent m) {
            dragging = 1;
            repaint();
        }


    }

}



public class principal{



    public static void main(String[] args) {
        new principal();

    }

    public principal() {
        JFrame frame = new JFrame();
        frame.add(new RouletteInterface());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

}

В чем проблема?
Событие MouseDragged по-прежнему срабатывает даже после того, как я отпущу щелчок мышью, поэтому при нажатии и перетаскивании курсора по другой стороне окна круг все еще движется с моим курсором

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Кроме того, вы можете рассмотреть возможность отрисовки / отрисовки микросхемы, используя режим графики XOR, вместо того, чтобы постоянно вызывать repaint ().

  1. Нажмите: отсканировать чип в обычном режиме,затем выполните Xor Draw.
  2. Drag: XOR нарисуйте фишку, сбросьте позицию, XOR нарисуйте снова.
  3. Отпустите: XOR нарисуйте фишку, затем нарисуйте в нормальном режиме.

Таким образом, если вы перемещаете чип над чем-то на заднем плане (или над другим чипом), вы не повредите другой чип или фон.

0 голосов
/ 07 февраля 2019

Ваша проблема в том, что вы добавляете два разных экземпляра ваших moneyMouseListeners в качестве MouseListener и MouseMotionListener:

    addMouseListener(new moneyMouseListener());
    addMouseMotionListener(new moneyMouseListener());

Вы должны сделать это следующим образом:

    moneyMouseListener mListener = new moneyMouseListener();
    addMouseListener(mListener);
    addMouseMotionListener(mListener);

PS.: При использовании такой переменной, как переменная типа «перетаскивание», которая используется только для присвоения «1» или «0», следует использовать логическую переменную с «true» и «false»;)

...