mouseDragged() i repaint() nie nadąża

0

Cześć, potrzebuję w programie małego painta, więc stworzyłem JFrame + JPanel do rysowania przez paintComponent, jednak przy szybkim pociągnięciu myszką spotyka mnie coś takiego:
user image

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        gz.setColor(Color.black);
        gz.fillOval(x, y, 5, 5);
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        System.out.println(brush);
        if (brush) {
            x = e.getX();
            y = e.getY();
            repaint();
        }

    }

Jak temu zaradzić?

0
  1. Jak to możliwe, że widać jednocześnie wiele kółek? super.paintComponent(g) wszystko wymazuje, a potem jest rysowane jedno kółko.
  2. Rysuj w pamięci (na obiekcie BufferedImage), a w paintComponent wywołuj drawImage(...). Powinno być lepiej.
0

Konstruktor:

                Image img = ImageIO.read(new File("C:/Users/Adrian/Desktop/img.jpg"));
BufferedImage image = new BufferedImage(img.getWidth(this),
                    img.getHeight(this), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2;
            g2 = tempImage.createGraphics();

Rysuję g2 na BufferedImage, a potem go w paintComponent:

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g2.setColor(Color.black);
        g2.drawOval(x, y, 5, 5);
        g.drawImage(image, 0, 0, this);
    }

Jednak nadal to samo ;f

0

Powinno wyglądać raczej tak:

        protected void paintComponent(Graphics g) {
                super.paintComponent(g
                g.drawImage(image, 0, 0, this);

A w obsłudze zdarzenia mouseDragged

                if (brush) {
                        x = e.getX();
                        y = e.getY();
                        Graphics g = tmpImage.getGraphics();
                        g.drawOval(x,y,5,5);
                        repaint();
                }

Sprawdziłem, rzeczywiście nie pomaga.

0

Znalazłem przykładowy program w Internecie, prześledziłem go i doprowadziłem swój do porządku:

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, this);
    }

@Override
    public void mouseDragged(MouseEvent e) {
        System.out.println(brush);
        if (brush) {
            currentX = e.getX();
            currentY = e.getY();
            g2.drawLine(oldX, oldY, currentX, currentY);
            repaint();
            oldX = currentX;
            oldY = currentY;
        }

    }

    @Override
    public void mousePressed(MouseEvent e) {
        oldX = e.getX();
        oldY = e.getY();
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0