Не работает repaint в JPanel

145
30 декабря 2021, 23:30

Всем привет. Проблема такова. У меня есть объект наследующий JPanel и рисующий картинку. Слушатель мыши при нажатии на мышь начинает менять координаты картинки в цикле. После каждого шага я вызываю repaint объекта JPanel, но он не срабатывает. В итоге вместо плавного движения картинки я имею мгновенный рывок. Почему метод repaint игнорируется? Вот пример кода

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.concurrent.TimeUnit;
public class Main extends JPanel {
    JFrame f;
    Level level;
    Player player;
    public static void main(String[] args) {
        new Main();
    }
    private Main(){
        initFrame();
    }
    private void initFrame(){
        f = new JFrame();
        level =new Level();
        player = new Player(level.getLvl());
        this.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e){
                System.out.println(e.getX());
                System.out.println(e.getY());
                for (int i = 0; i<500; i++){
                    player.coordImgX++;
                    repaint();
                    try {
                        TimeUnit.MILLISECONDS.sleep(2);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        });

        f.add(this);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(1100,600);
        f.setVisible(true);
    }
    public void paint(Graphics g){
        g = (Graphics2D)g;
        g.drawImage(level.getImage(),0,0,500,500,null);
        g.drawImage(player.getImage(),
               player.coordImgX,player.coordImgY,90,100,null);
    }
}
Answer 1

Вам нужно добавить задержку с помощью Thread.sleep(int *задержка в миллисекундах*). Но вам также нужно перехватывать InterruptedException, которое никогда не случится, если вы не завезёте многопоточность. Поэтому эту инструкцию нужно окружать с помощью блоков try/catch.

READ ALSO
как в sql добавить нули перед числом

как в sql добавить нули перед числом

есть поля которое может принимать четырехзначные числа если он 25 добавить два нуля перед числом если 9 то три нуля а если 123 то 1 нол как сделать

116
Java шифрование

Java шифрование

помогите пожалуйста что я нет так делаю ?

168
Как вывести значение?

Как вывести значение?

Есть такая строка

165