2017-01-30 2 views
0

Я хочу иметь простой JFrame с JLabel (для отображения изображений в виде значка) и JSlider (для переключения между 40 изображениями).Предварительная загрузка изображений для использования в качестве значка JLabel

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

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

+2

Да, это возможно. На данном этапе мы не можем помочь вам с конкретными особенностями, потому что вы их не получили. Почему бы просто не попробовать сначала? Если вы этого не сделаете, как мы узнаем, какие проблемы вы можете испытывать? –

+0

взгляните на класс 'java.awt.MediaTracker' и' ImageIcon' также использует 'MediaTracker', если я не ошибаюсь, поэтому довольно просто предварительно загрузить изображения. –

+1

Не загружать значки непосредственно в прослушиватель событий. Вместо этого используйте 'javax.swing.Timer' с задержкой. Таким образом, вы можете избежать загрузки ненужных изображений, когда пользователь быстро скользит (просто отмените старый таймер и запустите новый). –

ответ

2

Я полагаю, у вас есть что-то вроде этого:

public class MyClass { 
    // other declarations 
    private JLabel label; 
    // other methods 
    public void stateChange(ChangeEvent e) { 
     label.setIcon(new ImageIcon(...)); // here is code to determine name of the icon to load. 
       timer = null; 
    } 
} 

Что вам нужно изменить код следующим образом:

public class MyClass { 
    // other declarations 
    private JLabel label; 
    private Timer timer; // javax.swing.Timer 
    // other methods 
    public void stateChange(ChangeEvent e) { 
     if (timer != null) { 
      timer.stop(); 
     } 
     timer = new Timer(250, new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       label.setIcon(new ImageIcon(...)); // here is code to determine name of the icon to load. 
       timer = null; 
      } 
     }); 
     timer.setRepeats(false); 
     timer.start(); 
    } 
} 
Смежные вопросы