Я пытаюсь сделать 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();
}
});
}
}
заранее спасибо
Начните с создания перетасованного списка...
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);
и программа должна по-прежнему работать