1

JApplet 内に画像 (ボール) を表示しましたが、画像を垂直方向 (上下) に移動させたいと考えています。問題は、私がそれを行う方法がわからないことです。

誰かがこの問題について考えを持っていますか?

4

4 に答える 4

3

その画像の位置を計算値に設定する必要があります(つまり、時間、速度、およびその他の制限を使用して垂直位置を計算します)。

その位置をどのように設定するかは、画像の描画方法によって異なります。

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を参照してください。

于 2011-09-16T11:21:46.417 に答える
3

でやりたいJApplet

なぜ両方ではない?このアニメーションに示すように、ハイブリッド アプリケーション/アプレットを作成できます。

于 2011-09-16T14:46:24.843 に答える
3

によって作成された移動オブジェクトを使用したjavax.swing.Timerの別の例ですpaintComponent(Graphics g)。ぼやけたミカドではなく、たくさんのスタートがあります :-)

ここに画像の説明を入力

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);
            }
        }
    }
}
于 2011-09-16T12:55:16.100 に答える
3

JApplet内で画像を移動する方法..?

JFrameJComponentまたはJPanel... で行う場合とほぼ同じ方法です。

別の言い方すれば、アプレットとはの関係もなく、. 詳細については、Java チュートリアルの2D グラフィックス トレイルを参照してください。Graphics2D

画像を移動して にペイントする方法を理解したらGraphics2D、そのロジックをJComponentまたはJPanelのメソッドに実装し、画像を移動するコンポーネントをまたは(またはなど)paintComponent(Graphics)にドロップします。JAppletJFrameJPanel


アニメーション側ではjavax.swing.Timer、この例に見られるように a を使用します。この例では、どのコンポーネントも拡張しません。代わりに、 を作成し、ユーザーに表示されるBufferedImageに追加しJLabelます。タイマーが作動すると、コードGraphicsは画像のオブジェクトを取得し、そこから跳ね返る線を描画します。

100 跳ねるライン

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

image(2) を使用して JApplet(1) で実行したいのですが、可能ですか(3)?

  1. mKorbel と私自身による例は、 の画像JLabelまたは のカスタム レンダリングのいずれかを特徴としていJPanelます。この場合、コンポーネントを a JOptionPane& aに追加しましたJFrameJAppletどちらの例も、 、 、JDialog、または別のパネルの一部として簡単に追加できます。 詳細については、Java チュートリアルの「コンテナー内のコンポーネントのレイアウト」レッスンと「最上位コンテナーの使用」を参照してください。
  2. 例の星や線の代わりに、..イメージをペイントしてください。私の例は、コンテナの境界内で跳ね返る位置を取得する方法を示しています。
  3. 確かに可能ですが、「電池は含まれていません」。私たちの意図は、弾むボール アプレットに適用できるいくつかのアイデアを提供することです。アプレットでボールを使用して、あなたのために例を作成する人がいるとは思えません。ただし、あなたの意図と試したことを示すSSCCEを投稿すると、私 (および他の人) はそのソースで実行されることがよくあります。より具体的な回答が必要な場合は、より具体的な SSCCE に問い合わせてください。;)
于 2011-09-16T11:43:01.833 に答える