为什么我的方法没有清除 ArrayList?

2024-05-21

注意:我的代码的问题很简单,我创建了清除矩形和所有内容的方法,但我做错的唯一一件事是在 go() 方法内部实例化 DrawPanel 类的 myDraw 对象。因此,我必须使用 Stop 再次实例化 DrawPanel,这会创建一个全新的对象。因此,我最终在与要添加的矩形不同的 DrawPanel 对象上调用了clearRects 方法。不管怎样,我决定采用 MadProgrammer 的代码建议,因为他的代码正是《Java:初学者指南》所教的,而且更加简洁。

好吧,从今天早上开始我就一直在 StackOverflow 上运行,并且已经能够修复我的代码的很多问题,但是我仍然遇到了 ArrayLists 的这个问题。

我有下面的代码似乎没有达到我的预期目的。现在我意识到我是在某个地方犯了错误的人,但不太确定如何纠正它。

它的设置方式是,当我点击停止按钮时,ArrayList 应该清除,所以我有一个空白的 JPanel,可以这么说,这是代码片段。如果您愿意,我可以发布整个程序,但我只将代码片段粘贴在这里,因为我假设我犯了一个非常简单而愚蠢的错误:

class DrawPanel extends JPanel {
    ArrayList<MyRectangle> rects = new ArrayList<>();
    Random rand = new Random();

    @Override
    public void paintComponent(Graphics g) {

        super.paintComponent(g);

        addRect();

        for(MyRectangle r : rects) {
        g.setColor(r.getColor());
        g.fillRect(r.x, r.y, r.width, r.height);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(500,500);
    }

    public ArrayList<MyRectangle> addRect() {
        int ht = rand.nextInt(getHeight());
    int wd = rand.nextInt(getWidth());

    int x = rand.nextInt(getWidth() - wd);
    int y = rand.nextInt(getHeight() - ht);

    int r = rand.nextInt(256);
    int g = rand.nextInt(256);
    int b = rand.nextInt(256);

    rects.add(new MyRectangle(x, y, wd, ht, new Color(r, b, g)));
    System.out.println(rects.size());
    return rects;
}

    public void clearEvent(ActionEvent e) {
        System.out.println(rects.size());
        rects.clear();
        frame.repaint();
        System.out.println("I was called");
    }
}

这是按钮在其 actionPerformed 方法中调用它的部分:

class StopListener implements ActionListener {
    DrawPanel draw = new DrawPanel();
    public void actionPerformed(ActionEvent e) {
        timer.stop();
        draw.clearEvent(e);
    }
    }

编辑:我知道我的clearEvent方法引用的arraylist对象与addRect()添加内容的对象不同。我想,我要问的是如何使其“连接”,以便我可以使用 JButton 将东西擦干净。

编辑:这是完整的程序:

import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Random;
import java.awt.*;

public class TwoButtonsRandomRec {

    JFrame frame;
    Timer timer;

    public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            TwoButtonsRandomRec test = new TwoButtonsRandomRec();
            test.go();
        }
        });
    }

    public void go() {
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JButton startButton = new JButton("Start");
    startButton.addActionListener(new StartListener());
    JButton stopButton = new JButton("Stop");
    stopButton.addActionListener(new StopListener());

    final DrawPanel myDraw = new DrawPanel();

    timer = new Timer(50, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            myDraw.repaint();
        }
        });

    frame.add(startButton, BorderLayout.NORTH);
    frame.add(stopButton, BorderLayout.SOUTH);
    frame.add(myDraw, BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
    }

    class StartListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        timer.start();
    }
    }

    class StopListener implements ActionListener {
    DrawPanel draw = new DrawPanel();
    public void actionPerformed(ActionEvent e) {
        timer.stop();
        draw.clearEvent(e);
    }
    }

    class DrawPanel extends JPanel {
    ArrayList<MyRectangle> rects = new ArrayList<>();
    Random rand = new Random();

    @Override
    public void paintComponent(Graphics g) {

        super.paintComponent(g);

        addRect();

        for(MyRectangle r : rects) {
        g.setColor(r.getColor());
        g.fillRect(r.x, r.y, r.width, r.height);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(500,500);
    }

    public ArrayList<MyRectangle> addRect() {
        int ht = rand.nextInt(getHeight());
        int wd = rand.nextInt(getWidth());

        int x = rand.nextInt(getWidth() - wd);
        int y = rand.nextInt(getHeight() - ht);

        int r = rand.nextInt(256);
        int g = rand.nextInt(256);
        int b = rand.nextInt(256);

        rects.add(new MyRectangle(x, y, wd, ht, new Color(r, b, g)));
        System.out.println(rects.size());
        return rects;
    }

    public void clearEvent(ActionEvent e) {
        System.out.println(rects.size());
        rects.clear();
        repaint();
        System.out.println("I was called");
    }
    }
}

class MyRectangle extends Rectangle {
    Color color;
    public MyRectangle(int x, int y, int w, int h, Color c) {
    super(x, y, w, h);
    this.color = c;
    }

    public Color getColor() {
    return color;
    }
}

这是我之前在这里提出的相关问题,以防有人感兴趣。

奇怪的 JFrame 行为 https://stackoverflow.com/questions/13822019/strange-jframe-behavior


我看到两个迫在眉睫的问题。

第一个是,你正在打电话addRectpaintComponent方法,这意味着,即使您清除了List,在下一次重新绘制时,将添加一个新的矩形。

其次,我会打电话repaint in the DrawPanel而不是使用frame.repaint(),因为您实际上只想更新绘图面板,而不是整个框架

public class BadPaint05 {

    public static void main(String[] args) {
        new BadPaint05();
    }

    public BadPaint05() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new MasterPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MasterPane extends JPanel {

        private DrawPanel drawPane;
        private Timer timer;

        public MasterPane() {
            setLayout(new BorderLayout());
            drawPane = new DrawPanel();

            add(drawPane);

            JButton stop = new JButton("Stop");
            stop.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    drawPane.clearEvent(e);
                    timer.stop();
                }
            });

            timer = new Timer(500, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    drawPane.addRect();
                }
            });
            timer.setRepeats(true);
            timer.setCoalesce(true);
            timer.start();

            add(stop, BorderLayout.SOUTH);

        }

    }

    class DrawPanel extends JPanel {

        ArrayList<MyRectangle> rects = new ArrayList<>();
        Random rand = new Random();

        @Override
        public void paintComponent(Graphics g) {

            super.paintComponent(g);

//            addRect();

            for (MyRectangle r : rects) {
                g.setColor(r.getColor());
                g.fillRect(r.x, r.y, r.width, r.height);
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(500, 500);
        }

        public ArrayList<MyRectangle> addRect() {
            int ht = rand.nextInt(getHeight());
            int wd = rand.nextInt(getWidth());

            int x = rand.nextInt(getWidth() - wd);
            int y = rand.nextInt(getHeight() - ht);

            int r = rand.nextInt(256);
            int g = rand.nextInt(256);
            int b = rand.nextInt(256);

            rects.add(new MyRectangle(x, y, wd, ht, new Color(r, b, g)));
            System.out.println(rects.size());
            repaint();
            return rects;
        }

        public void clearEvent(ActionEvent e) {
            System.out.println(rects.size());
            rects.clear();
//            frame.repaint();
            repaint();
            System.out.println("I was called");
        }
    }

    public class MyRectangle {

        private int x, y, width, height;
        private Color color;

        private MyRectangle(int x, int y, int wd, int ht, Color color) {
            this.x = x;
            this.y = y;
            this.width = wd;
            this.height = ht;
            this.color = color;
        }

        public Color getColor() {
            return color;
        }

    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的方法没有清除 ArrayList? 的相关文章

  • 是什么决定了从 lambda 创建哪个函数式接口?

    请考虑这个例子 import java util function Consumer public class Example public static void main String args Example example new
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • 在 Netbeans 8 上配置 JBoss EAP 的问题

    我已经下载了 JBoss EAP 7 并正在 Netbeans 8 上配置它 我已经到达向导 实例属性 其中要求从选择框中选择 域 当我打开选择框时 它是空的 没有什么可以选择的 因此 完成 按钮也处于非活动状态 这使得无法完成配置 我通过
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • 如何在 Java 中测试一个类是否正确实现了 Serialized(不仅仅是 Serialized 的实例)

    我正在实现一个可序列化的类 因此它是一个与 RMI 一起使用的值对象 但我需要测试一下 有没有办法轻松做到这一点 澄清 我正在实现该类 因此在类定义中添加 Serialized 很简单 我需要手动序列化 反序列化它以查看它是否有效 我找到了
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • Java整数双除法混淆[重复]

    这个问题在这里已经有答案了 方案1 int sum 30 double avg sum 4 result is 7 0 not 7 5 VS 方案2 int sum 30 double avg sum 4 0 Prints lns 7 5
  • Netty:阻止调用以获取连接的服务器通道?

    呼吁ServerBootstrap bind 返回一个Channel但这不是在Connected状态 因此不能用于写入客户端 Netty 文档中的所有示例都显示写入Channel从它的ChannelHandler的事件如channelCon
  • Cucumber Java 与 Spring Boot 集成 - Spring @Autowired 抛出 NullPointer 异常

    我正在为 Spring boot 应用程序编写 cucumber java 单元测试来测试每个功能 当我与 Spring Boot 集成时 Autowired 类抛出 NullPointer 异常 Spring Boot应用程序类 Spri
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创
  • 保存符号方程以供以后使用?

    From here http www mathworks com help releases R2011a toolbox symbolic brvfu8o 1 html brvfxem 1 我正在尝试求解这样的符号方程组 syms x y
  • 当ScrollView滚动到底部时加载更多数据

    我有一个带有动态加载内容的滚动视图 有时可能会有很多内容 所以我想在用户滚动到底部时加载更多内容 我搜索了合适的方法 发现了两种 onScrollChanged and getScrollY 但我不知道如何将它用于我的目的 请给我一些建议
  • 如果产品重量超过1000克,如何以公斤为单位显示

    在 Storefront 主题中 我使用下面的代码将格式化重量从 1000g 更改为 1kg add action woocommerce after shop loop item title show weight 10 function
  • android ndk 硬件调试内存

    背景 我对 C 很有经验 对 Android 和 Java 还很陌生 但这是编程的环境问题 我已经用 ANSI C 开发了一个管理应用程序 可以移植到任何操作系统 只需在依赖于操作系统的代码中添加 UI 即可 它使用相当多的内存 特别是对于
  • CUDA 中指令重放的其他原因

    这是我从 nvprof CUDA 5 5 获得的输出 Invocations Metric Name Metric Description Min Max Avg Device Tesla K40c 0 Kernel MyKernel do
  • Android 中的连字符

    作为 Android 应用程序国际化的一部分 我遇到了在正确位置动态换行或连字符的需要 我的所有字符串都外部化在 strings xml 文件中 但我没有找到任何有关 Android 中连字符的文档 我希望能够建议连字符位置 类似于我在 L
  • 从 ASP.NET 5 引用 .NET 4.6 项目会导致生成错误

    在我的 ASP NET 5 RC1 项目 仅针对 dnx46 中 我尝试添加对针对 net 4 6 的 经典 类库项目的引用 我在构建时收到此错误 MSBuild 14 0 bin Microsoft Common CurrentVersi
  • 将剪贴板图像粘贴到画布

    我有一个画布 我需要用户能够将图像粘贴到上面 我希望这是跨浏览器的 我只想使用 html javascript 我也愿意使用 Flash 对象 这在 Chrome 中工作得很好 尽管到目前为止我还没有弄清楚如何让它在 Firefox 中工作
  • 如何在 zend Framework 2 中禁用渲染视图?

    我想使用一些 ajax 但我不知道如何使用与 zend Framework 2 中的 setNoRender 相同的函数来禁用渲染视图 如何在 zend Framework 2 中禁用渲染视图 要禁用您的视图 public function
  • PrototypeJS 版本 1.6.0.2 覆盖 JSON.parse 和 JSON.stringify 并破坏 socket.io 功能

    基本上 socket io 使用 nativeJSON 来编码和解码数据包 而我的问题是我必须使用这个版本的原型来改变 JSON 行为 当我应该进入服务器时 如下所示 socket on event function a b c 我明白了s
  • CoAP数据包的大小是多少?

    我是这项技术的新手 有人可以帮助我了解一些疑问吗 Q 1 CoAP数据包的大小是多少 我知道有 4 字节固定标头 但是包括标头 选项和负载在内的最大大小限制是多少 Q 2 有像MQTT那样的Keep Alive的概念吗 它在UDP上工作 它
  • Python 无法导入名称

    我花了大半夜的时间试图解决导入错误 这是一个常见问题 但之前的问题都没有完全回答我的问题 我正在使用 PyDev 一个 Eclipse 插件 和 Kivy 库 一个 Python 库 我的文件结构设置如下 code init py main
  • 在node.js中生成密码重置令牌

    如何在 node js 中生成可在 url 中使用的密码重置令牌 我只需要生成令牌的方法 user reset password token user reset password expire expire date 编辑 这是解决方案
  • 表情符号未正确保存在 mongodb 中

    我正在将 Twitter 和 Instagram 上的表情符号保存到我的 mongodb 数据库中 但是当我显示从数据库中提取的数据时 表情符号看起来像这样破损了 在将数据保存到 mongodb 期间我需要做一些不同的事情吗 我是 mong
  • Pandas:将类别转换为数字

    假设我有一个包含国家 地区的数据框 如下所示 cc temp US 37 0 CA 12 0 US 35 0 AU 20 0 我知道有一个 pd get dummies 函数可以将国家 地区转换为 one hot 编码 但是 我希望将它们转
  • 如何根据“配置管理器”创建自己定义的常量?

    当我选择 调试 配置时 DEBUG常数处于活动状态 当我选择 释放 配置时 DEBUG常量处于非活动状态 我如何创建自己的配置 以便它们包含我自己定义的常量 基本上 我想要这样 如果我选择配置 FOOBAR 就会有一个常量FOO and B
  • Gitlab Runner Docker 登录在连接期间无法正常工作错误:Post http://docker:2375/v1.40/auth: dial tcp: Lookup docker on 67.207.67.3:53

    我在 gitlab runner 上使用 docker executor 作为我正在使用的图像docker stable我收到此错误 docker login gitlab mydomain com 5050 u myusername p
  • 调用模块中的导入

    我仍在学习 python 在玩完 pygame 之后 我注意到我正在重新导入我已经导入的模块中的内容 import pygame 例如 我在单独的文件中有一些类 但我还必须将 pygame 导入到该文件中才能使它们正常工作 它实际上导入代码
  • 为什么我的方法没有清除 ArrayList?

    注意 我的代码的问题很简单 我创建了清除矩形和所有内容的方法 但我做错的唯一一件事是在 go 方法内部实例化 DrawPanel 类的 myDraw 对象 因此 我必须使用 Stop 再次实例化 DrawPanel 这会创建一个全新的对象