(несколько изображений) анимация Java - PullRequest
0 голосов
/ 01 июня 2018

У меня есть набор узлов в моей программе, каждый из которых имеет определенное местоположение x, y.и у каждого есть набор значков изображений.

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

Вот мой код: (здесь показано только последнее изображение, которое я знаю почему!)

public void showPicture()  {
        //nodes : 
        for(int i=0;i<thisGraph.getNode().size();i++){
            if(thisGraph.getNode().get(i).getImageIcon()!=(null)){
                for(int j=0;j<thisGraph.getNode().get(i).getImageIcon().size();j++){
                    if(j>0)
                       lables.get(lables.size()-1).setVisible(false);
                    JLabel jLabel1 = new JLabel();
                    lables.add(jLabel1);
                    jLabel1.setLayout(new GridBagLayout());
                    jLabel1.setIcon(thisGraph.getNode().get(i).getImageIcon().get(j));
                    jLabel1.setVisible(true);
                    jLabel1.setBounds((int)thisGraph.getNode().get(i).getX(),(int)thisGraph.getNode().get(i).getY(),195,163);           
                    jPanel1.add(jLabel1);

                }
            }
        }
    }

Этот метод showPicture () вызывается в buttonActionListener.И у меня также есть еще одна кнопка, которую я хочу, чтобы она остановила анимацию изображений для всех меток.

Что я пробовал: Thread.sleep() -> она замораживает кнопку и показывает только последнее изображение

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

Edit -> я прочитал эти примеры, приведенные вкомментарии.и вот что я решил, но он все еще застывает кнопку и не работает:

int j = 0;
    public void showPicture(){
        //nodes : 
        for(int i=0;i<thisGraph.getNode().size();i++){
            if(thisGraph.getNode().get(i).getImageIcon()!=(null)){
              j=0;
                while( j<thisGraph.getNode().get(i).getImageIcon().size()){

                    if(j>0)
                        lables.get(lables.size()-1).setVisible(false);
                    JLabel jLabel1 = new JLabel();
                    lables.add(jLabel1);
                    jLabel1.setLayout(new GridBagLayout());
                    jLabel1.setIcon(thisGraph.getNode().get(i).getImageIcon().get(j));
                    jLabel1.setVisible(true);
                    jLabel1.setBounds((int)thisGraph.getNode().get(i).getX(),(int)thisGraph.getNode().get(i).getY(),195,163);

                    jPanel1.add(jLabel1);

                    //

                    ActionListener act;
                    act = new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            jLabel1.setVisible(true);        
                            j++;
                        }
                    };
                    Timer timer = new Timer(1000, act );
                    timer.start();

                    timer.stop();
                    //

                }
            }
        }}

1 Ответ

0 голосов
/ 02 июня 2018

Качели однопоточные и не безопасны.Это означает, что вы не должны блокировать поток диспетчеризации событий с помощью длительных или блокирующих операций, таких как Thread.sleep.Также следует обновлять пользовательский интерфейс (или все, на что он опирается) только в контексте потока диспетчеризации событий.

Подробнее см. Параллельность в Swing .

Вероятно, самое простое решение вашей проблемы - использовать Swing Timer.

Идея состоит в том, что вы используете один Timer в качестве "основного цикла анимации", изменяя свойства ALLобъекты, которые вам нужны, обновляются внутри него.

Ниже приведен довольно простой пример, он анимирует 100 JLabel с, просто меняя их цвет фона случайным образом выбранным цветом

Sparkle

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private List<JLabel> nodes = new ArrayList<>(100);

        private Random random = new Random();
        private Color[] colors = new Color[] { Color.RED, Color.GREEN, Color.BLUE, Color.BLACK, Color.MAGENTA};

        public TestPane() {
            setLayout(new GridLayout(0, 10));
            for (int index = 0; index < 100; index++) {
                JLabel label = new JLabel();
                label.setBorder(new EmptyBorder(5, 5, 5, 5));
                label.setOpaque(true);
                label.setBackground(pickColor());
                nodes.add(label);
                add(label);
            }
            Timer timer = new Timer(500, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    for (JLabel label : nodes) {
                        label.setBackground(pickColor());
                    }
                }
            });
            timer.start();
        }

        protected Color pickColor() {
            return colors[random.nextInt(colors.length)];
        }

    }

}

См. Как использовать Swing Timers для получения более подробной информации

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