-1

我有一些关于从 arrayList 中删除对象的问题,如下所示,我创建了一个 JComponent,将其添加到 arrayList,然后将其添加到 JPanel,然后我将其从 Arraylist 中删除,但它仍然卡在面板?为什么该对象仍被添加到 Jpanel ?由“添加”方法引用?我应该 jp.remove(obj) 完全删除吗?如果没有,我如何完全删除它?<-主要问题。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Frame extends JFrame{
public Frame(){
    Jpanel jp = new Jpanel();
    getContentPane().add(jp);
    setPreferredSize(new Dimension(200,200));
    setVisible(true);
    pack();
}

public class Jpanel extends JPanel{

    public Jpanel(){
        ArrayList<Obj> ArrList = new ArrayList<Obj>();
        setLayout(null);
        Obj obj = new Obj();
        ArrList.add(obj);
        add(obj);
        ArrList.remove(0);
        System.out.println(ArrList);
        revalidate();
        repaint();

    }
}

public class Obj extends JComponent{
    public Obj(){
        setBounds(0,0, 100 , 100);
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.green);
        g.fillRect(50, 50, 50, 50);
    }
}
public static void main(String[] args) {
Frame f = new Frame();
}

}

4

3 回答 3

2

您的 ArrayList 与屏幕上绘制的内容无关。在您调用之后add(obj),对象在 JPanel 中,直到您调用为止remove(obj)

于 2013-06-29T21:05:37.530 回答
2

为什么该对象仍被添加到 Jpanel ?

通过方法ArrList.remove(0),您实际上是从其自身引用的对象中删除ArrayList 对该对象的引用obj。该对象仍保留在堆上。如果无法通过强引用访问该对象,则该对象将被垃圾收集是不同的。但是该对象没有被垃圾回收,因为JPanel它仍在引用该对象。

我应该 jp.remove(obj) 完全删除吗?

通过这样做,您可以从中删除对象JPanel并使该对象符合垃圾回收的条件,但是您不能从堆内存中显式删除该对象。只有 JVM 决定何时对对象进行垃圾回收。

于 2013-06-29T21:11:36.333 回答
1

是的,只要在某个非守护线程上有对该对象的引用,该对象就会持久存在。

将对象添加到 ArrayList 只是为 ArrayList 提供对您的对象的引用。当您删除对象时,ArrayList 会忘记该引用。只有当一切都忘记了对象时,才会删除被引用的对象。

要完全删除它,您必须消除对它的所有引用或可能引用它的事物。然后,垃圾收集器会在它认为需要内存时删除它的数据。

于 2013-06-29T21:06:04.873 回答