MouseDragging в GUI - PullRequest
       2

MouseDragging в GUI

3 голосов
/ 03 января 2012

Я хочу, чтобы этот код выполнялся, когда я нажимаю и перетаскиваю красный шарик на экране, я хочу, чтобы он двигался с помощью курсора мыши, этот код выполняет свою работу и частично взят из кода Sun, поэтому предполагается, чточтобы быть эффективным, но все же, если я перемещаю мышь слишком быстро, она перестает тянуть мышь ...

как мне преодолеть это?

    public class SwingPaintDemo3 {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI(); 
            }
        });
    }

    private static void createAndShowGUI() {
        JFrame f = new JFrame("Swing Paint Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        f.add(new MyPanel());
        f.pack();
        f.setVisible(true);
    } 
}

class MyPanel extends JPanel {

    private int X = 0;
    private int Y = 0;
    private int R = 20;


         public MyPanel() {

        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                if ((X<=e.getX() && X+R>=e.getX()) && ( Y<=e.getY() && Y+R>=e.getY())) moveVertex(e.getX(),e.getY());
            }
        });

        addMouseMotionListener(new MouseAdapter() {
            public void mouseDragged(MouseEvent e) {
                if ((X<=e.getX() && X+R>=e.getX()) && ( Y<=e.getY() && Y+R>=e.getY())) moveVertex(e.getX(),e.getY());
            }
        });

    }

    private void moveVertex(int x, int y) {
        int OFFSET = 1;
        if ((X!=x) || (Y!=y)) {
            repaint(X,Y,R+OFFSET,R+OFFSET);
            X=x-10;
            Y=y-10;
            repaint(X,Y,R+OFFSET,R+OFFSET);
        } 
    }


    public Dimension getPreferredSize() {
        return new Dimension(250,200);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);       
        g.drawString("This is my custom Panel!",10,20);
        g.setColor(Color.RED);
        g.fillOval(X,Y,R,R);
        g.setColor(Color.BLACK);
        g.drawOval(X,Y,R,R);
    }  
}

Ответы [ 2 ]

4 голосов
/ 03 января 2012

Эта проблема возникает из-за того, что поток обработчика событий Java недостаточно быстр для обработки события mouseDragged, когда вы слишком быстро перемещаете мышь.Допустим, у вас есть указатель мыши в центре круга, но вы перемещаете его очень быстро для некоторых направлений, поэтому событие mouseDragged вызывается только тогда, когда мышь находится за пределами области круга, поэтому указатель мыши не «с циклом»"больше.

Решение этой проблемы - использование логической переменной со статусом mouseButton. Если щелкнуть мышью внутри круга, вы сделаете так, чтобы круг перемещался мышью куда угодно!Если парень отпускает кнопку мыши, ваша мышь просто движется.

    class MyPanel extends JPanel {
        ...
        private boolean holdedInsideCircle = false;


           public MyPanel() {

               addMouseListener(new MouseAdapter() {
                   public void mousePressed(MouseEvent e) {
                    if ((X<=e.getX() && X+R>=e.getX()) && ( Y<=e.getY() && Y+R>=e.getY()))
                        moveVertex(e.getX(),e.getY());
                        holdedInsideCircle = true;
                   }
                   @Override
                   public void mouseReleased(MouseEvent e) {
                       //Doesn't matter where, if the mouse button is released
                       holdedInsideCircle = false;
                   }
               });


               addMouseMotionListener(new MouseAdapter() {
                   public void mouseDragged(MouseEvent e) {
                       //if ((X<=e.getX() && X+R>=e.getX()) && ( Y<=e.getY() && Y+R>=e.getY()))
                       if(holdedInsideCircle)
                           moveVertex(e.getX(),e.getY());
                   }
               });

        }
4 голосов
/ 03 января 2012

Попробуйте этот вариант.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SwingPaintDemo3 {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI() {
        JFrame f = new JFrame("Swing Paint Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new MyPanel());
        f.pack();
        f.setVisible(true);
    }
}

class MyPanel extends JPanel {

    private int X = 0;
    private int Y = 0;
    private int R = 20;
    private boolean isDrag = false;

    public MyPanel() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if ((X<=e.getX() && X+R>=e.getX()) && ( Y<=e.getY() && Y+R>=e.getY())) {
                    moveVertex(e.getX(),e.getY());
                    isDrag = true;
                }
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                isDrag = false;
            }
        });

        addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if (isDrag) moveVertex(e.getX(),e.getY());
            }
        });
    }

    private void moveVertex(int x, int y) {
        int OFFSET = 1;
        if ((X!=x) || (Y!=y)) {
            repaint(X,Y,R+OFFSET,R+OFFSET);
            X=x-10;
            Y=y-10;
            repaint(X,Y,R+OFFSET,R+OFFSET);
        }
    }

    public Dimension getPreferredSize() {
        return new Dimension(250,200);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString("This is my custom Panel!",10,20);
        g.setColor(Color.RED);
        g.fillOval(X,Y,R,R);
        g.setColor(Color.BLACK);
        g.drawOval(X,Y,R,R);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...