Плавное движение с Java Swing - PullRequest
1 голос
/ 18 марта 2020

У меня проблемы с плавным и плавным движением с java Swing. Использование этого кода, которое включает в себя использование BufferedImage для рисования графики до ее применения к панели, дает мне результаты с дрожанием движения и заиканием. Как я могу это исправить?

public class SmoothMotion extends JPanel {

    public static final int size = 800;
    public static int pos = 0;

    public static void main(String[] args) {
        JPanel panel = new SmoothMotion();
        JFrame frame = new JFrame("Smooth As");
        frame.setSize(size, size);
        frame.add(panel);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Timer timer = new Timer(17, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                SmoothMotion.updateItems();
                panel.repaint();
            }
        });
        timer.start();
    }

    public static void updateItems() {
        pos += 4;
        pos = pos > 750 ? 0 : pos;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, size, size);
        g.setColor(Color.RED);
        g.fillRect(pos > 375 ? 750 - pos : pos, 100, 50, 50);
    }
}

1 Ответ

2 голосов
/ 18 марта 2020
  1. не отменять краску (). Выборочная окраска выполняется путем переопределения paintComponent(...)

  2. , нет необходимости в BufferedImage. По умолчанию Swing имеет двойную буферизацию. Просто сначала вызовите super.paintComponent(graphics), чтобы очистить фон, а затем сделайте свою собственную картину.

  3. метод рисования НЕ должен изменять свойства класса. У вас должен быть метод типа updatePos(…) для обновления позиции.

  4. ActionLIstener вызовет updatePos(), который затем вызовет repaint().

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

...