GUI в JAVA для отображения разных изображений в одном кадре

1

Я хочу отображать разные изображения в одном кадре в цикле. 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();
        }
    }
}
Теги:
user-interface
jframe
jlabel
imageicon

1 ответ

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

Ваша проблема является общей: вы вызываете 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();
  • Примечание: код не компилируется и не тестируется и публикуется только как общий пример шагов, которые следует учитывать.
  • 0
    Я использовал таймер, он работал. Но у меня проблема с остановкой и перезапуском таймера при нажатии кнопки. Примечание: timer.stop () и timer.restart () не работают должным образом (таймер не останавливается).
  • 0
    @Akash: у вас сейчас новая проблема, и вам нужно будет задать новый вопрос. Пожалуйста, примите этот ответ (нажмите на большую галочку рядом с этим ответом) и задайте новый вопрос на этом сайте, один с вашим новым кодом, желательно с минимальным примером программы . Пожалуйста, прочитайте ссылку, чтобы увидеть, как создать один из них. Удачи.

Ещё вопросы

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