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