且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Java小程序重绘一个动圈

更新时间:2023-02-05 22:07:32

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

  1. You need to call super.paint(g); in your paint method, as to not leave paint artifacts.

永远不要从 paint 方法内部调用 repaint()

Never call repaint() from inside the paint method

不要像在 update() 中那样显式调用 paint,当您打算调用 reapaint()

Don't explicitly call paint, as you do in update(), when you mean to call reapaint()

只需从 update() 方法内部更新 xy 值,然后调用 repaint()

just update the x and y values from inside the update() method, then call repaint()

您不需要在 update()

您需要在循环中的某处重复调用 update(),因为它会更新 xyreapint()s

You need to call update() somewhere repeatedly in a loop, as it updates the x and y and reapint()s

如果您的类将成为 Runnable,那么您应该在 run() 方法中放入一些代码.那可能是您应该拥有循环的地方

If your class is going to be a Runnable, then you should put some code in the run() method. That's probably where you should have your loop

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);

    }
}

附注

  • 首先为什么要使用小程序.如果必须,为什么要使用 AWT Applet 而不是 Swing JApplet?是时候升级了.
  • Why use Applets in the first place. If you must, why use AWT Applet and not Swing JApplet? Time for an upgrade.

这是我如何在 Swing 中重做整个事情,使用 Swing Timer 而不是循环和 Thread.sleep,如你应该做的.

Here's how I'd redo the whole thing in Swing, using a Swing Timer instead of a loop and Thread.sleep, as you should be doing.

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);
            }
        });
    }
}

  • 请参阅如何使用摆动计时器

    请参阅使用 Swing 创建 GUI

    更新

    问题是,这是一个 JPANEL 应用程序.我特别想让小程序在网页上易于使用."

    "Problem is, that's a JPANEL application. I specifically want to make an applet easily usable on a web page. "

    你仍然可以使用它.只需使用 JPanel.取出 main 方法,而不是 Applet,使用 JApplet 并将 JPanel 添加到您的小程序中.就这么简单.

    You can still use it. Just use the JPanel. Take out the main method, and instead of Applet, use a JApplet and just add the JPanel to your applet. Easy as that.

    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.JApplet;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    
    public class CircleApplet extends JApplet {
    
        @Override
        public void init() {
            add(new Circle());
        }
    
        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);
            }
    
        }
    }