Java repaint()方法不使用';尝试从面板中删除形状时无法工作

Java repaint()方法不使用';尝试从面板中删除形状时无法工作,java,object,methods,repaint,Java,Object,Methods,Repaint,我想每秒钟画一些圆圈,并将它们全部(或至少一个)从面板中删除 以下是现有代码: public class DrawShape { ShapePanel panel; public DrawShape(ShapePanel panel) { this.panel = panel; Timer t = new Timer(); t.schedule(new TimerTask() {

我想每秒钟画一些圆圈,并将它们全部(或至少一个)从面板中删除

以下是现有代码:

    public class DrawShape {
        ShapePanel panel;
        public DrawShape(ShapePanel panel) {
            this.panel = panel;

            Timer t = new Timer();
            t.schedule(new TimerTask() {
                long startTime = System.currentTimeMillis();
                int secondsToRun = 3;
                @Override
                public void run() {
                    if (System.currentTimeMillis() - startTime > secondsToRun * 1000) {
                        panel.deleteCircle();
                        System.out.println("\t" + panel.circles.size());
                        cancel();
                    } else {
                        panel.addCircle(new Circle((int) (Math.random() * 200), (int) (Math.random() * 200)));
                        System.out.println(panel.circles.size());
                    }
                }
            }, 0, 1000);
        }
    }
如果时间大于3秒,请删除所有圆圈,否则继续在屏幕上绘制圆圈

以下是ShapePanel类:

    public class ShapePanel extends JPanel {

        public List<Circle> circles = new LinkedList<Circle>();

        public ShapePanel() {

            // Setting up the frame
            JFrame frame = new JFrame();
            frame.setSize(500, 500);
            frame.setVisible(true);
            frame.setBackground(Color.black);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(this); // adding the panel to the frame
        }

        public void addCircle(Circle circle) {
            circles.add(circle);
            this.repaint();
        }

        public void deleteCircle() {
    //        circles.remove(circles.get(0));
            circles.clear(); //remove them all
            this.repaint();

        }

        @Override
        public void paint(Graphics g) {
            for (Circle c : circles) {
                g.setColor(Color.GREEN);
                g.drawOval(c.x, c.y, Circle.radius * 2, Circle.radius * 2);
            }
        }
    }
公共类ShapePanel扩展了JPanel{
public List circles=new LinkedList();
公共形状面板(){
//设置框架
JFrame=新JFrame();
框架。设置尺寸(500500);
frame.setVisible(true);
框架.立根背景(颜色.黑色);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);//将面板添加到框架中
}
公共空间添加圆(圆){
圆。添加(圆);
这个。重新绘制();
}
公共循环(){
//圆.remove(圆.get(0));
圆圈。清除();//将它们全部删除
这个。重新绘制();
}
@凌驾
公共空间涂料(图g){
用于(圆c:圆){
g、 setColor(Color.GREEN);
g、 绘图椭圆(c.x,c.y,圆半径*2,圆半径*2);
}
}
}
当我调用deleteCircle()时,这些圆应该从列表中删除并重新绘制。我应该得到一个没有圆圈的空白屏幕。我认为在这种情况下,重新油漆不起作用


p.S.:第一次问问题,如果问题太长,我很抱歉:D

所以,有两件事立刻向我扑来

  • 使用
    java.util.Timer
  • Swing不是线程安全的,因为
    java.util.Timer
    在它自己的线程中运行,所以更新UI(或者在本例中,UI依赖的东西)可能会导致随机问题

    <>我会考虑使用<代码> javax、Swing、Time< /Cord>,因为它在事件调度队列内被触发(通常使用起来更简单)

  • 不调用
    super.paint
  • 您没有考虑到
    paint
    的功能,也没有接管它的职责,在本例中,这将是“准备”绘图的
    上下文

    Graphics
    是一个共享资源,它将传递给在绘制过程中更新的所有组件。这意味着它将包含以前绘制的内容

    两项建议:

  • 作为一般建议,最好覆盖
    paintComponent
    而不是
    paint
    paint
    做了很多重要的工作,所以除非你愿意做,否则通常会在绘制链中处于高位)
  • 在进行任何自定义绘制之前,首先调用
    super.paintComponent
  • 我强烈建议阅读:


    我使用了super.paintComponent,它工作正常,即使我的背景颜色改变了(我认为它可以通过某种方式修复)。问题是,今天我从java graphics开始(我有一个应用程序要提交给学校),我呆了10-11小时,我仍然在尝试做研究、教程和其他工作。我会仔细看看你寄来的。谢谢你,先生!确保您只从
    paintComponent
    中调用
    super.paintComponent
    ,不要从
    paint
    中调用-您绕过了许多关键功能。首先,我应该看到它们之间的差异,似乎它们与我想象的大不相同。非常感谢你的帮助!