Java applet重新绘制一个移动的圆圈

时间:2014-03-08 18:32:35

标签: java applet awt graphics2d

我刚从Pygame搬过来,所以applet中的Java 2D对我来说有点新鲜,特别是在重新绘制屏幕时。在pygame中你可以简单地做display.fill([1,1,1])但是如何在Java中的applet中执行此操作?我理解repaint()的使用但不清除屏幕 - 任何移动的物体都没有从屏幕上“移除”,所以你只需画出一长串画圆。

这是我一直在测试的代码:

package circles;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Random;

public class circles extends Applet implements Runnable {
    private static final long serialVersionUID = -6945236773451552299L;
    static Random r = new Random();

    String msg = "Click to play!";
    static int w = 800, h = 800;

    int[] txtPos = { (w/2)-50,(h/2)-50 };
    int[] radiusRange = { 5,25 };
    int[] circles;
    static int[] posRange;

    int x = 0, y = 0;
    int radius = 0;
    int cursorRadius = 10;

    boolean game = false;

    public static int[] pos() {
        int side = r.nextInt(5-1)+1;
        switch(side) {
            case 1:
                posRange = new int[]{ 1,r.nextInt(w),r.nextInt((h+40)-h)+h,r.nextInt(270-90)+90 };
                break;
            case 2:
                posRange = new int[]{ 2,r.nextInt((w+40)-w)+w,r.nextInt(h),r.nextInt(270-90)+90 };
                break;
            case 3:
                posRange = new int[]{ 3,r.nextInt(w),r.nextInt(40)-40,r.nextInt(180) };
                break;
            case 4:
                posRange = new int[]{ 4,r.nextInt(40)-40,r.nextInt(h),r.nextInt(180) };
                break;
        }
        System.out.println(side);
        return posRange;
    }
    public void start() {
        setSize(500,500);
        setBackground(Color.BLACK);
        new Thread(this).start();
    }

    public void run() {

    }
    public void update(Graphics g) {
        paint(g);
    }

    public void paint(Graphics e) {
        Graphics2D g = (Graphics2D) e;

        if(System.currentTimeMillis()%113==0) {
            x+=1;
            y+=1;
        }

        g.setColor(Color.BLUE);
        g.fillOval(x,y,20,20);

        repaint();
    }
}

1 个答案:

答案 0 :(得分:5)

  1. 您需要在super.paint(g);方法中调用paint,以免留下油漆瑕疵。

  2. 切勿在{{1​​}}方法

  3. 内拨打repaint()
  4. 当您打算致电paint

  5. 时,请不要像在paint中那样明确致电update()
  6. 只需更新reapaint()方法中的xy值,然后调用update()

  7. 您无需在repaint()

  8. 中使用Graphics参数
  9. 您需要在循环中反复调用update(),因为它会更新update()x以及y s

  10. 如果您的课程将是reapint(),那么您应该在Runnable方法中添加一些代码。这可能就是你应该拥有循环的地方


  11. run()

    附注

    • 为什么首先使用Applet。如果必须,为什么要使用AWT import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; public class circles extends Applet implements Runnable { int x = 0, y = 0; public void start() { setSize(500, 500); setBackground(Color.BLACK); new Thread(this).start(); } public void run() { while (true) { try { update(); Thread.sleep(50); } catch (InterruptedException ex) { } } } public void update() { x += 5; y += 6; repaint(); } public void paint(Graphics e) { super.paint(e); Graphics2D g = (Graphics2D) e; g.setColor(Color.BLUE); g.fillOval(x, y, 20, 20); } } 而不是Swing Applet?升级的时间。

    以下是我在Swing中使用Swing JApplet代替循环和Timer 重做的方法,正如您应该做的那样。

    Thread.sleep


    <强>更新

      

    “问题是,这是一个JPANEL应用程序。我特别希望在网页上轻松使用applet。”

    你仍然可以使用它。只需使用JPanel。取出main方法,而不是Applet,使用JApplet,只需将JPanel添加到您的applet。很简单。

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    
    public class Circle extends JPanel{
        private static final int D_W = 500;
        private static final int D_H = 500;
    
        int x = 0;
        int y = 0;
        public Circle() {
            setBackground(Color.BLACK);
    
            Timer timer = new Timer(50, new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    x += 5;
                    y += 5;
                    repaint();
                }
            });
            timer.start();
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLUE);
            g.fillOval(x, y, 20, 20);
    
        }
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(D_W, D_H);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JFrame frame = new JFrame();
                    frame.add(new Circle());
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }