Я хочу отображать разные изображения в одном кадре в цикле. String pathName [] содержит различные пути изображений. При запуске этого кода на экране появляется только последнее изображение, т.е. изображение в пути pathname [last], и я хочу, чтобы все изображения отображались непрерывным образом (дали задержку в 1 сек.). Помощь приветствуется.
public void actionPerformed(ActionEvent event) {
int i=0;
while(i<5){
if(i>0){
Container labelParent = receiverImageLabel.getParent();
labelParent.remove(receiverImageLabel);
labelParent.validate();
labelParent.repaint();
}
try {
imageR = ImageIO.read(new File(pathName[i++])).getScaledInstance(512,512 , BufferedImage.SCALE_SMOOTH);
receivedImage = new ImageIcon(imageR);
}catch (IOException e) {
e.printStackTrace();
}
receiverImageLabel = new JLabel(receivedImage);
receiverFrame.getContentPane().add(BorderLayout.EAST,receiverImageLabel);
receiverFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
receiverFrame.setSize(800,700);
receiverFrame.setVisible(true);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Ваша проблема является общей: вы вызываете Thread.sleep(...)
в графическом интерфейсе Swing в потоке событий и по существу ставили весь GUI в режим сна.
Google Таймер Swing и используйте это вместо вашего цикла while/Thread.sleep(...)
Кроме того, если изображения не слишком велики, подумайте об их просмотре сразу (в фоновом потоке), помещая их в ImageIcons, а затем заменяя JLabel ImageIconsand в вашем таймере Swing.
Например, вы можете сделать что-то вроде:
ImageIcon[] icons = new ImageIcon[IMAGE_COUNT];
for (int i = 0; i < IMAGE_COUNT; i++) {
BufferedImage img = ImageIO.read(...); // read in the appropriate image
// ...... here manipulate the image if desired such as re-size it
icons[i] = new ImageIcon(img); // put it into an icon
}
в другом месте:
int timerDelay = 1000;
new Timer(timerDelay, new ActionListener(){
int count = 0;
@Override
public void actionPerformed(ActionEvent e) {
if (count < IMAGE_COUNT) {
someLabel.setIcon(icons[count]);
count++;
} else {
// stop the timer
((Timer)e.getSource()).stop();
}
}
}).start();