Как перемешать изображение в последовательности?

1

Я пытаюсь сделать Java-приложение для рабочего стола, где я хочу сделать auto image shuffle, я могу это сделать, но проблема в том, что он не перетасовывает все изображение, которое я дал, я хочу перетасовать все изображения, как я могу достичь этого

Вот код, который я нашел здесь:

/**
 * @see /questions/8178953/how-to-auto-change-image-in-java-swing/15558237#15558237
 * @see https://stackoverflow.com/a/12228640/230513
 */
public class ImageShuffle extends JPanel {

   private List<Icon> list = new ArrayList<Icon>();

   private JLabel label = new JLabel();
   private Timer timer = new Timer(1000, new ActionListener() {

      @Override
       public void actionPerformed(ActionEvent e) {
        update();
       }
   });

   public ImageShuffle() {
       this.setLayout(new GridLayout(1, 0));

      list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\e.jpg"));
    list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\d.jpg"));
    list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\yellow.png"));
      list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\f.jpg"));
         //   list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\yellow.jpg"));
       //label.setIcon(UIManager.getIcon("OptionPane.informationIcon"));

       timer.start();
   }

   private void update() {

    Random r=new Random();
    int i1=(r.nextInt(3) +1);

    label.setIcon(list.get(i1));
}

private void display() {
    JFrame f = new JFrame("ImageShuffle");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(this);
    f.add(label);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {

           @Override
          public void run() {
              new ImageShuffle().display();
           }
       });
   }
 }

заранее спасибо

Теги:
timer
swing
imageicon

1 ответ

2
Лучший ответ

Начните с создания перетасованного списка...

private List<Icon> list = new ArrayList<Icon>();
private List<Icon> shuffled;

//...

list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\e.jpg"));
list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\d.jpg"));
list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\yellow.png"));
list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\f.jpg"));

shuffled = new ArrayList<Icon>();
update();

Каждый раз, когда ваш таймер actionPerformed и вызывает actionPerformed, actionPerformed первый элемент shuffled списка, пока ничего не останется...

 if (shuffled.isEmpty()) {
    shuffled.addAll(list);
    // Prevent the current image from been selected next...
    shuffled.remove(label.getIcon());
    Collections.shuffle(shuffled);
 }

 Icon icon = shuffled.remove(0);
 label.setIcon(icon);

Это позволит удалить возможность отображения изображения несколько раз подряд. Вычисление случайных значений должно быть больше похоже на int i1 = (r.nextInt(list.size())); так или иначе...

Заметки:

ImageShuffle не нужно расширять с JPanel, вы ничего не добавляете к нему. Это означает, что вы можете избавиться от this.setLayout(new GridLayout(1, 0)); и f.add(this); и программа должна по-прежнему работать

Ещё вопросы

Сообщество Overcoder
Наверх
Меню