Java, анимировать неподвижное изображение в JApplet

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

Это изображение приборной панели автомобиля, и когда пользователь нажал на зажигание, я увидел, есть ли способ заставить изображение дрожать на секунду. Я пытался искать здесь и в Google, но каждый раз, когда я искал, я получал статьи из 90-х годов для апплетов, а не JApplet.

Если бы вы могли указать мне в правильном направлении, как "оживить" изображение или даже в место, где могут быть учебники, я был бы признателен!

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

public class ImageMap extends JApplet implements MouseListener{
   private Image pic;
   private Container contentPane;
   private JLabel directions;
   private Rectangle horn;
   private Rectangle vent;
   private Rectangle doorLocksUpper;
   private Rectangle window;
   private Rectangle radio;
   private Rectangle ignition;
   private int x, y;
   private AudioClip hornSound, airSound, radioClip, lockSound1, lockSound2, ignitionSound;

public void init() {        
    pic = getImage(getCodeBase(), "CarDash.jpg");
    horn = new Rectangle(250, 142, 105,104);
    vent = new Rectangle(514, 159, 204, 72);
    doorLocksUpper = new Rectangle(80, 167, 104, 58);
    window = new Rectangle(122, 243, 88, 55);
    radio = new Rectangle(514, 234, 176, 171);
    ignition = new Rectangle(465, 217, 42, 43);

    directions = new JLabel("CLICK ON: Horn, Door Locks, Air Vents, Radio & Ignition Push Start");

    //Create components
    contentPane = getContentPane();
    contentPane.setLayout(new FlowLayout());
    contentPane.add(directions, BorderLayout.NORTH);
    contentPane.addMouseListener(this);
}


//Display image on applet window
public void paint(Graphics g) {
    g.drawImage(pic, 0, 40, this);

}

public void mouseClicked(MouseEvent me) {
    //Play horn clip when car horn is clicked.
    if(horn.contains(me.getX(), me.getY())) {
        play(getCodeBase(), "HornSound.wav");
    }
    if(vent.contains(me.getX(), me.getY())) {
        play(getCodeBase(), "AirVent.wav");
    }
    if(ignition.contains(me.getX(), me.getY())) {
        play(getCodeBase(), "Ignition.wav");
    }
    if(doorLocksUpper.contains(me.getX(), me.getY())) {
        play(getCodeBase(), "DoorLocks.wav");
    }
    if(radio.contains(me.getX(), me.getY())) {
        play(getCodeBase(), "BrownSugar.mid");
    }
    if(window.contains(me.getX(), me.getY())) {
        play(getCodeBase(), "Window.wav");
    }
}
public void mouseReleased(MouseEvent me) {}
public void mouseEntered(MouseEvent me) {}
public void mouseExited(MouseEvent me) {}
public void mousePressed(MouseEvent me) {}
}

1 ответ

Решение

Вот очень быстрый и полезный совет, не рисуйте непосредственно в контейнер верхнего уровня, как апплет. Он заключает вас в единый сценарий использования, который не всегда облегчает изменение или повторное использование.

Вместо этого начните с использования чего-то вроде JPanel в качестве основного контейнера, вы можете добавить его к тому, что вам нравится, апплету, окну, другому контейнеру.

Хотя в Swing существует множество способов анимации, одним из самых простых (и, как правило, наиболее безопасных) является использование Swing. Timer,

Этот пример просто использует Swing Timerустановите для обновления каждые 16 мс (что является быстрым для моего программного обеспечения для захвата:P), которое запускается при нажатии на панель. Таймер просто обновляет значение смещения, которое изолирует положительное и отрицательное значения. Timer использует LocalTime рассчитать продолжительность времени Timer работает на остановках через одну секунду

Встряхни ребенка

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.time.Duration;
import java.time.LocalTime;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ShakeAnimation {

    public static void main(String[] args) {
        new ShakeAnimation();
    }

    public ShakeAnimation() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new ShakePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ShakePane extends JPanel {

        private Timer timer;
        private LocalTime startTime;
        private int xOffset = 0;
        private int delta = 8;

        private BufferedImage img;

        public ShakePane() {
            try {
                img = ImageIO.read(getClass().getResource("Duke-Thumbs.jpg"));
            } catch (IOException exp) {
                exp.printStackTrace();
            }
            timer = new Timer(16, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Duration duration = Duration.between(startTime, LocalTime.now());
                    if (duration.getSeconds() >= 1) {
                        timer.stop();
                        xOffset = 0;
                    } else {
                        xOffset *= -1;
                    }
                    repaint();
                }
            });
            addMouseListener(new MouseAdapter() {

                @Override
                public void mouseClicked(MouseEvent e) {
                    if (!timer.isRunning()) {
                        xOffset = delta;
                        startTime = LocalTime.now();
                        timer.start();
                    }
                }

            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (img != null) {
                Graphics2D g2d = (Graphics2D) g.create();
                int x = ((getWidth() - img.getWidth()) / 2) + xOffset;
                int y = (getHeight() - img.getHeight()) / 2;
                g2d.drawImage(img, x, y, this);
                g2d.dispose();
            }
        }

    }

}

См. Как использовать Swing Timers для более подробной информации.

Другие вопросы по тегам