我调用一个方法来实例化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);
}
}
答案 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
。