Как сделать галерею изображений с помощью java

Для класса я работаю над своим первым приложением с графическим интерфейсом. Это просто программа для просмотра изображений с четырьмя кнопками: «Предыдущая», «Далее», «Стоп», «Воспроизвести». Предыдущий и следующий работают нормально, но, честно говоря, я даже не знаю, как начать работу над частью слайд-шоу (Воспроизведение и остановка). Я знаю, что есть класс таймера, который, вероятно, был бы удобен для управления скоростью при изменении изображений... но я не уверен, какая логика обычно используется для циклического переключения изображений. Может ли кто-нибудь указать мне правильное направление, мой мозг немного поджарен в этот момент: 0

Я включил свой код ниже. Я новичок в этом, так что, надеюсь, люди не будут слишком критиковать мою технику. Если это имеет значение, я работаю в eclipse.

вот мой код до сих пор:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.TimerTask;


public class ImageGallery extends JFrame
{
    private ImageIcon myImage1 = new ImageIcon ("Chrysanthemum.jpg");
    private ImageIcon myImage2 = new ImageIcon ("Desert.jpg");
    private ImageIcon myImage3 = new ImageIcon ("Jellyfish.jpg");
    private ImageIcon myImage4 = new ImageIcon ("Penguins.jpg");
    JPanel ImageGallery = new JPanel();
    private ImageIcon[] myImages = new ImageIcon[4];
    private int curImageIndex=0;

    public ImageGallery ()
        {   
            ImageGallery.add(new JLabel (myImage1));
            myImages[0]=myImage1;
            myImages[1]=myImage2;
            myImages[2]=myImage3;
            myImages[3]=myImage4;

            add(ImageGallery, BorderLayout.NORTH);

            JButton PREVIOUS = new JButton ("Previous");
            JButton PLAY = new JButton ("Play");
            JButton STOP = new JButton ("Stop");
            JButton NEXT = new JButton ("Next");

            JPanel Menu = new JPanel();
            Menu.setLayout(new GridLayout(1,4));
            Menu.add(PREVIOUS);
            Menu.add(PLAY);
            Menu.add(STOP);
            Menu.add(NEXT);

            add(Menu, BorderLayout.SOUTH);

            //register listener
            PreviousButtonListener PreviousButton = new PreviousButtonListener ();
            PlayButtonListener PlayButton = new PlayButtonListener ();
            StopButtonListener StopButton = new StopButtonListener ();
            NextButtonListener NextButton = new NextButtonListener ();

            //add listeners to corresponding componenets 
            PREVIOUS.addActionListener(PreviousButton);
            PLAY.addActionListener(PlayButton);
            STOP.addActionListener(StopButton);
            NEXT.addActionListener(NextButton);

        }

    public static void main (String [] args)
        {
            ImageGallery frame = new ImageGallery();

            frame.setSize(490,430);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
        }



    class PreviousButtonListener implements ActionListener 
    {

        public void actionPerformed(ActionEvent e)
            {
                if(curImageIndex>0 && curImageIndex <= 3)
                    {   ImageGallery.remove(0);
                        curImageIndex=curImageIndex-1;
                        ImageIcon TheImage= myImages[curImageIndex];
                        ImageGallery.add(new JLabel (TheImage));
                        ImageGallery.validate();
                        ImageGallery.repaint(); 
                    }
                else 
                    {   
                        ImageGallery.remove(0);
                        ImageGallery.add(new JLabel (myImage1));
                        curImageIndex=0;
                        ImageGallery.validate();
                        ImageGallery.repaint();
                    }
            }
    }

    class PlayButtonListener implements ActionListener 
    {
        public void actionPerformed(ActionEvent e)
            {
                        // *need help here*//

            }
    }

    class StopButtonListener implements ActionListener 
    {
        public void actionPerformed(ActionEvent e)
            {
                        // *need help here*//
            }
    }

    class NextButtonListener implements ActionListener 
    {


        public void actionPerformed(ActionEvent e)
        {

            if(curImageIndex>=0 && curImageIndex < 3)
                {   ImageGallery.remove(0);
                    curImageIndex = curImageIndex + 1;
                    ImageIcon TheImage= myImages[curImageIndex];
                    ImageGallery.add(new JLabel (TheImage));
                    ImageGallery.validate();
                    ImageGallery.repaint(); 
                }
            else 
                {   
                    ImageGallery.remove(0);
                    ImageGallery.add(new JLabel (myImage4));
                    curImageIndex=3;
                    ImageGallery.validate();
                    ImageGallery.repaint();
                }

        }
    }
}

person ThisBetterWork    schedule 23.04.2012    source источник
comment
Никогда не используйте java.util.Timer для Swing, избегайте его, насколько это возможно, поскольку обновления для Swing, сделанные с его помощью, станут для вас одной большой головной болью, поскольку вам придется выполнять эти обновления в потоке EDT - диспетчера событий. Попробуйте посмотреть javax.swing.Timer. , Вот небольшая программа для вашей помощи SlideShow   -  person nIcE cOw    schedule 23.04.2012


Ответы (4)


Вот некоторые рекомендации, которые могут помочь вам начать:

Сначала вам понадобится отдельный поток для управления изменяющимися изображениями. Я предлагаю вам написать класс, реализующий TimerTask. Переопределите метод run() в этом классе. В этом методе запуска вы должны поместить функциональность для изменения текущего отображаемого изображения (аналогично тому, что вы делали в следующей и предыдущей функциях).

В методе actionPerformed() для кнопки воспроизведения вам нужно будет создать экземпляр класса Timer и запустить свой таймер с помощью метода scheduleAtFixedRate (задача TimerTask, длительная задержка, длительный период) (могут использоваться и другие методы этого класса). , scheduleAtFixedRate() кажется более подходящим).

Для остановки вам нужно будет добавить достаточно функций, чтобы остановить работающий таймер, используя метод cancel() в классе Timer.

person Brendan Cutajar    schedule 23.04.2012
comment
Для операций, связанных с Swing, вам лучше использовать таймер Swing. Поскольку все действия, связанные со Swing, должны происходить в EDT, а таймер Swing позаботится об этом за вас. - person Robin; 23.04.2012

Зачем усложнять простые вещи,

person mKorbel    schedule 23.04.2012
comment
Не уверен, является ли CardLayout лучшим вариантом здесь. Это будет означать, что у вас есть все изображения в памяти, и в зависимости от размера/количества изображений, которые вы хотите просмотреть, может потребоваться много памяти. В этом случае я бы выбрал BorderLayout и всегда заменял изображение - person Robin; 23.04.2012
comment
@Robin есть 1) память для уже загруженных изображений 2) память Graphics2D 3) что-то, что я пропустил, вывод для 2-го. точка AFAIK только в настоящее время видна независимо от рендеринга Graphics2D, - person mKorbel; 23.04.2012
comment
Договорился, что в его SSCCE уже выделена память под образы. Я больше говорил о том, что средство просмотра изображений может просматривать весь набор изображений, а CardLayout - не лучший вариант IMO. - person Robin; 23.04.2012
comment
хм, хорошо, бизнес-концепция, проблемы, а затем опубликуйте здесь ответ о SwingWorker и java.util.Queue for Icons, - person mKorbel; 23.04.2012

В этом примере показана кнопка запуска/остановки, которая управляет javax.swing.Timer. Вместо замены ярлыка каждый раз просто обновите ярлык Icon, как предложил @mKorbel и показано здесь.

person trashgod    schedule 23.04.2012

Вам нужно использовать поток для слайд-шоу. Вы можете использовать флаг в методе запуска для продолжения показа или остановки, если этот флаг изменится, например, логическую переменную. Один пример вы можете увидеть в http://java.sun.com/developer/technicalArticles/Threads/applet/.

person Paul Vargas    schedule 23.04.2012