Как переместить изображение внутри JApplet по вертикальной линии? - PullRequest
1 голос
/ 16 сентября 2011

Я отобразил изображение (шарик) внутри JApplet, теперь я хочу, чтобы изображение двигалось по вертикали (вверх и вниз).Проблема в том, что я не знаю, как это сделать.

Может ли кто-то иметь представление по этому поводу?

Ответы [ 4 ]

3 голосов
/ 16 сентября 2011

Я хочу сделать это в JApplet.

Почему не оба? Вы можете иметь гибридное приложение / апплет, как показано в этой анимации .

3 голосов
/ 16 сентября 2011

Как переместить изображение внутри JApplet ..?

Практически точно так же, как вы можете сделать это в JFrame, JComponent или JPanel или...

Или, другими словами, ничего не имеет отношения к апплетам и все связано с Graphics2D.Для получения дополнительной информации см. 2D Graphics Trail Учебного руководства по Java.

Когда вы поймете, как переместить изображение и нарисовать его в Graphics2D, реализуйте эту логику вJComponent или JPanel paintComponent(Graphics) и поместите компонент с движущимся изображением в JApplet или JFrame (или JPanel и т. Д.).


Длясторона анимации, используйте javax.swing.Timer, как показано в этом примере.Этот пример не расширяет ни один компонент.Вместо этого он создает BufferedImage и добавляет его к JLabel, отображаемому для пользователя.Когда таймер срабатывает, код захватывает объект Graphics изображения и переходит оттуда к отскакивающим линиям.

100 Bouncing Lines

import java.awt.image.BufferedImage;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.*;
import javax.swing.*;
import java.util.Random;

class LineAnimator {

    public static void main(String[] args) {
        final int w = 640;
        final int h = 480;
        final RenderingHints hints = new RenderingHints(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON
            );
        hints.put(
            RenderingHints.KEY_ALPHA_INTERPOLATION,
            RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY
            );
        final BufferedImage bi = new BufferedImage(w,h, BufferedImage.TYPE_INT_ARGB);
        final JLabel l = new JLabel(new ImageIcon(bi));
        final BouncingLine[] lines = new BouncingLine[100];
        int factor = 1;
        for (int ii=0; ii<lines.length; ii++) {
            lines[ii] = new BouncingLine(w*factor,h*factor);
        }
        final Font font = new Font("Arial", Font.BOLD, 30);
        ActionListener al = new ActionListener() {

            int count = 0;
            long lastTime;
            String fps = "";
            private final BasicStroke stroke = new BasicStroke(6);

            public void actionPerformed(ActionEvent ae) {
                count++;
                Graphics2D g = bi.createGraphics();
                g.setRenderingHints(hints);
                g.setColor(new Color(55,12,59));
                g.fillRect(0,0,w,h);
                g.setStroke(stroke);

                for (int ii=0; ii<lines.length; ii++) {
                    lines[ii].move();
                    lines[ii].paint(g);
                }

                if ( System.currentTimeMillis()-lastTime>1000 ) {
                    lastTime = System.currentTimeMillis();
                    fps = count + " FPS";
                    count = 0;
                }
                g.setColor(Color.YELLOW);
                g.setFont(font);
                g.drawString(fps,5,h-5);

                l.repaint();
                g.dispose();
            }
        };
        Timer timer = new Timer(25,al);
        timer.start();

        JOptionPane.showMessageDialog(null, l);
        //System.exit(0);
        timer.stop();
    }
}

class BouncingLine {
    private final Color color;
    private static final Random random = new Random();
    Line2D line;
    int w;
    int h;
    int x1;
    int y1;
    int x2;
    int y2;

    BouncingLine(int w, int h) {
        line = new Line2D.Double(random.nextInt(w),random.nextInt(h),random.nextInt(w),random.nextInt(h));
        this.w = w;
        this.h = h;
        this.color = new Color(
            random.nextInt(255)
            ,random.nextInt(255)
            ,random.nextInt(255)
            ,64+random.nextInt(128)
            );
        x1 = (random.nextBoolean() ? 1 : -1);
        y1 = (random.nextBoolean() ? 1 : -1);
        x2 = -x1;
        y2 = -y1;
    }

    public void move() {
        int tx1 = 0;
        if (line.getX1()+x1>0 && line.getX1()+x1<w) {
            tx1 = (int)line.getX1()+x1;
        } else {
            x1 = -x1;
            tx1 = (int)line.getX1()+x1;
        }
        int ty1 = 0;
        if (line.getY1()+y1>0 && line.getY1()+y1<h) {
            ty1 = (int)line.getY1()+y1;
        } else {
            y1 = -y1;
            ty1 = (int)line.getY1()+y1;
        }
        int tx2 = 0;
        if (line.getX2()+x2>0 && line.getX2()+x2<w) {
            tx2 = (int)line.getX2()+x2;
        } else {
            x2 = -x2;
            tx2 = (int)line.getX2()+x2;
        }
        int ty2 = 0;
        if (line.getY2()+y2>0 && line.getY2()+y2<h) {
            ty2 = (int)line.getY2()+y2;
        } else {
            y2 = -y2;
            ty2 = (int)line.getY2()+y2;
        }
        line.setLine(tx1,ty1,tx2,ty2);
    }

    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor(color);
        //line.set
        g2.draw(line);
    }
}

Обновление 1

Я хочу сделать это в JApplet (1), используя изображение (2), возможно ли это (3)?

  1. Примеры mKorbel и меня содержат либоизображение в JLabel или пользовательский рендеринг в JPanel.В нашем случае мы добавили компоненты к JOptionPane & JFrame.Любой пример может быть так же легко добавлен к JApplet, или JDialog, или как часть другой панели, или ... См. Компоновка компонентов в контейнере урок & ИспользованиеКонтейнеры верхнего уровня в руководстве по Java для получения более подробной информации.
  2. Вместо звездочек или линий в наших примерах, ... нарисуйте свое изображение.Мой пример заходит так далеко, что демонстрирует, как заставить положение колебаться в пределах контейнера.
  3. Конечно, это возможно, но "Батареи не включены".Наше намерение состоит в том, чтобы дать вам некоторые идеи, которые вы можете затем адаптировать к вашему апплету прыгающего мяча.Я сомневаюсь, что кто-то собирается создать для вас пример, используя шарики, в апплете.Хотя, если вы опубликуете SSCCE , который показывает ваши намерения и то, что вы пытались, я (и другие) часто использовал этот источник.Если вы хотите получить более конкретные ответы, задайте более конкретный SSCCE.;)
3 голосов
/ 16 сентября 2011

еще один пример для javax.swing.Timer с движущимися объектами Ojbect, созданными paintComponent(Graphics g), и у меня много Start, а не какой-то размытый Mikado: -)

enter image description here

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

public class AnimationBackground {

    private Random random = new Random();
    private JFrame frame = new JFrame("Animation Background");
    private final MyJPanel panel = new MyJPanel();
    private JLabel label = new JLabel("This is a Starry background.", JLabel.CENTER);
    private JPanel stopPanel = new JPanel();
    private JPanel startPanel = new JPanel();

    public AnimationBackground() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        panel.setBackground(Color.BLACK);
        for (int i = 0; i < 50; i++) {
            Star star = new Star(new Point(random.nextInt(490), random.nextInt(490)));
            star.setColor(new Color(100 + random.nextInt(155), 100 + random.nextInt(155), 100 + random.nextInt(155)));
            star.setxIncr(-3 + random.nextInt(7));
            star.setyIncr(-3 + random.nextInt(7));
            panel.add(star);
        }
        panel.setLayout(new GridLayout(10, 1));
        label.setForeground(Color.WHITE);
        panel.add(label);
        stopPanel.setOpaque(false);
        stopPanel.add(new JButton(new AbstractAction("Stop this madness!!") {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                panel.stopAnimation();
            }
        }));
        panel.add(stopPanel);
        startPanel.setOpaque(false);
        startPanel.add(new JButton(new AbstractAction("Start moving...") {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                panel.startAnimation();
            }
        }));
        panel.add(startPanel);
        frame.add(panel);
        frame.pack();
        frame.setLocation(150, 150);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                AnimationBackground aBg = new AnimationBackground();
            }
        });
    }

    private class Star extends Polygon {

        private static final long serialVersionUID = 1L;
        private Point location = null;
        private Color color = Color.YELLOW;
        private int xIncr, yIncr;
        static final int WIDTH = 500, HEIGHT = 500;

        Star(Point location) {
            int x = location.x;
            int y = location.y;
            this.location = location;
            this.addPoint(x, y + 8);
            this.addPoint(x + 8, y + 8);
            this.addPoint(x + 11, y);
            this.addPoint(x + 14, y + 8);
            this.addPoint(x + 22, y + 8);
            this.addPoint(x + 17, y + 12);
            this.addPoint(x + 21, y + 20);
            this.addPoint(x + 11, y + 14);
            this.addPoint(x + 3, y + 20);
            this.addPoint(x + 6, y + 12);
        }

        public void setColor(Color color) {
            this.color = color;
        }

        public void move() {
            if (location.x < 0 || location.x > WIDTH) {
                xIncr = -xIncr;
            }
            if (location.y < 0 || location.y > WIDTH) {
                yIncr = -yIncr;
            }
            translate(xIncr, yIncr);
            location.setLocation(location.x + xIncr, location.y + yIncr);
        }

        public void setxIncr(int xIncr) {
            this.xIncr = xIncr;
        }

        public void setyIncr(int yIncr) {
            this.yIncr = yIncr;
        }

        public Color getColor() {
            return color;
        }
    }

    private class MyJPanel extends JPanel {

        private static final long serialVersionUID = 1L;
        private ArrayList<Star> stars = new ArrayList<Star>();
        private Timer timer = new Timer(20, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                for (Star star : stars) {
                    star.move();
                }
                repaint();
            }
        });

        public void stopAnimation() {
            if (timer.isRunning()) {
                timer.stop();
            }
        }

        public void startAnimation() {
            if (!timer.isRunning()) {
                timer.start();
            }
        }

        @Override
        public void addNotify() {
            super.addNotify();
            timer.start();
        }

        @Override
        public void removeNotify() {
            super.removeNotify();
            timer.stop();
        }

        MyJPanel() {
            this.setPreferredSize(new Dimension(512, 512));
        }

        public void add(Star star) {
            stars.add(star);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            for (Star star : stars) {
                g.setColor(star.getColor());
                g.fillPolygon(star);
            }
        }
    }
}
3 голосов
/ 16 сентября 2011

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

Как вы установите эту позицию, зависит от того, как вы рисуете изображение.

Пример, основанный на рисовании в апплете (или вложенном компоненте) paint(Graphics g) метод:

//first calculate the y-position
int yPos += timeSinceLastPaint * speed; //increment the position
if( (speed > 0 && yPos > someMaxY) || (speed < 0 && yPos <0 ) ) {
  speed *= -1; //if the position has reached the bottom (max y) or the top invert the direction  
}


//in your paint(Graphics g) method:
g.drawImage(image, yPos, x, null);

Тогда вам придется постоянно перекрашивать апплет.

Более подробную информацию об анимации в апплетах можно найти здесь: http://download.oracle.com/javase/tutorial/uiswing/components/applet.html

...