调用PaintComponent时,数组的大小变为0

时间:2016-12-09 15:45:39

标签: java swing arraylist

我调用一个方法来实例化5个对象并将它们添加到ArrayList。当我调用另一种方法来打印ArrayList的大小时,它会显示大小为5.在我创建paintComponent并将其添加到JPanel后调用JFrame时,并尝试从ArrayList打印paintComponent的大小,它将大小显示为0.查看System.out.println的顺序我知道paintComponent正在被调用在我创建并向ArrayList添加对象之后。为什么ArrayList显示为空?

(这是我在一个简短可验证的例子中的第二次尝试)

预期产出:

尺寸,printInfo:5
尺寸,printInfo:5
尺寸,油漆成分:5
尺寸,油漆成分:5

实际输出

尺寸,printInfo:5
尺寸,printInfo:5
尺寸,油漆成分:0
Size,paintComponent:0

档案:

public class Item{
//Empty
}

面板:

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

import javax.swing.JPanel;

public class Panel extends JPanel{
    ArrayList<Item> stuff = new ArrayList<Item>();

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        System.out.println("Size, paintComponent: " + stuff.size());
    }

    public void setUpPanel(){
        for (int i = 0; i<5; i++)
            stuff.add(new Item());
    }

    public void printInfo(){
        System.out.println("Size, printInfo: " + stuff.size());
    }
}

框:

import javax.swing.JFrame;

public class Frame extends JFrame{
    public static void main (String args[]){
        Panel j = new Panel();
        j.setUpPanel();
        j.printInfo();
        Frame frame = new Frame();
        j.printInfo();
    }

    public Frame(){
        super("Test");
        add(new Panel());
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800,600);
        setLocationRelativeTo(null);
    }
}

2 个答案:

答案 0 :(得分:3)

您正在使用Panel的两个实例。第一个是在主方法中创建的:

public static void main (String args[]){
    Panel j = new Panel(); // <-- here
    j.setUpPanel();
    j.printInfo();
    Frame frame = new Frame();
    j.printInfo();
}

Frame构造函数中的第二个:

public Frame(){
    super("Test");
    add(new Panel()); // <-- here
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(800,600);
    setLocationRelativeTo(null);
}

这些实例中的每一个都拥有自己的列表实例。由于您只填充其中一个列表,因此另一个列表仍为0。

答案 1 :(得分:3)

这一行:

add(new Panel());

添加了一个从未调用过Panel的{​​{1}},显然它的列表是空的。

您可能想要传递其他setUpPanel()

Panel

请注意,建议不要使用其他现有类的名称,这会误导import javax.swing.JFrame; public class Frame extends JFrame{ public static void main (String args[]){ Panel j = new Panel(); j.setUpPanel(); j.printInfo(); Frame frame = new Frame(j); j.printInfo(); } public Frame(Panel panel){ super("Test"); add(panel); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800,600); setLocationRelativeTo(null); } } java.awt.Panel