Анимация серии изображений - PullRequest
       12

Анимация серии изображений

1 голос
/ 16 декабря 2009

Я анимирую серию изображений в Java. Пока что я могу анимировать без проблем. Проблема возникает только тогда, когда я добавляю в управление (Пуск, Стоп и т. Д.). Когда я нажимаю Start в моем GUI, GUI не показывает анимацию, только последний кадр отображается после того, как анимация закончилась.

Я не уверен, что это проблема многопоточности или рисования, поскольку я пробовал несколько методов, и ни один из них не работал.

Ниже мой код:

public class SwingAnimation extends JPanel implements ActionListener {</p> <pre><code>protected JFrame frame; protected JLabel lblDisplay; protected JButton BtnStart, BtnStop, BtnPause; protected JCheckBox chkLoop; protected Thread th; public static void main(String[] args) { SwingAnimation sa = new SwingAnimation(); } public SwingAnimation() { frame = new JFrame("Animation"); Panel panel = new Panel(); lblDisplay = new JLabel(); BtnStart = new JButton("Start"); BtnStop = new JButton("Stop"); BtnPause = new JButton("Pause"); chkLoop = new JCheckBox("Loop"); BtnStop.setEnabled(false); BtnPause.setEnabled(false); BtnStart.setActionCommand("start"); BtnStop.setActionCommand("stop"); BtnPause.setActionCommand("pause"); panel.add(lblDisplay); panel.add(BtnStart); panel.add(BtnPause); panel.add(BtnStop); panel.add(chkLoop); frame.add(panel, BorderLayout.CENTER); frame.setSize(400, 400); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //set the frame in the center of the screen Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize(); int screen_x = (screensize.width - frame.getWidth()) / 2; int screen_y = (screensize.height - frame.getHeight()) / 2; frame.setLocation(screen_x, screen_y); BtnStart.addActionListener(this); BtnStop.addActionListener(this); BtnPause.addActionListener(this); chkLoop.addActionListener(this); th = new Thread(); //ImageAnimator(); } public void ImageAnimator() { try { for (int i = 0; i <= 299; i++) { ImageIcon images = new ImageIcon("C:\\Users\\Desktop\\Images\\Snap" + i + ".jpg"); lblDisplay.setIcon(images); th.sleep(25); } } catch (InterruptedException e) { } } public void actionPerformed(ActionEvent e) { if ("start".equals(e.getActionCommand())) { BtnStart.setEnabled(false); BtnStop.setEnabled(true); BtnPause.setEnabled(true); lblDisplay.setVisible(true); ImageAnimator(); } else if ("stop".equals(e.getActionCommand())) { BtnStart.setText("Start"); BtnStart.setEnabled(true); BtnStop.setEnabled(false); BtnPause.setEnabled(false); lblDisplay.setVisible(false); th = null; } else if ("pause".equals(e.getActionCommand())) { BtnStart.setText("Resume"); BtnStart.setEnabled(true); BtnStop.setEnabled(true); BtnPause.setEnabled(false); } }

}

Ответы [ 2 ]

3 голосов
/ 16 декабря 2009

Быстрое исправление:

Изменить ImageAnimator () следующим образом:

        lblDisplay.setIcon(images);
        lblDisplay.paintImmediately(getBounds());
        th.sleep(25);

Проблема, с которой вы столкнулись, заключается в том, что установка значка не приводит к автоматической перерисовке Swing компонента на экране. Вызов paintImmediate сделает это.

Общие рекомендации:

Анимация в разгаре обычно выполняется с помощью Swing Timer . В этот момент вы заметите, что ваш пользовательский интерфейс не отвечает - запустив анимацию, вы не сможете остановить ее, пока она не закончится. Это связано с тем, что все события Swing происходят в одном потоке - нити диспетчеризации событий. Выполнение цикла с Thread.sleep (...) в середине связывает этот поток, оставляя его недоступным для обработки другого ввода (например, нажатия кнопки остановки)

Эта статья неизмеримо помогла мне, когда я пытался понять, как Swing обрабатывает параллелизм, и Swing Trail дает множество советов по эффективному использованию Swing, рисованию пользовательских компонентов и т. Д.

Я бы также включил демонстрационный код в Filthy Rich Clients , я сейчас работаю над книгой, и это стоит посмотреть.

1 голос
/ 16 декабря 2009

Этот учебник по Java 2D-играм охватывает несколько основных приемов анимации. Некоторые связанные примеры, иллюстрирующие методы, приведены здесь , а в этом полном примере показаны кнопки остановки и запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...