【发布时间】:2013-11-14 18:08:30
【问题描述】:
我正在创建一个小型 JPanel 程序来生成迷宫。我所有的代码都有效,但我想显示迷宫生成的实际效果。我编辑了我的程序以使paintComponent 函数显示正在进行的迷宫。但是我在另一个类中,该类正在传递我的 JPanel 对象,因此它可以“刷新”显示。
我应该怎么做才能调用paintComponent函数来绘制所有单元格并刷新显示?
这是面板的配置:
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout());
gamePanel = new GamePanel();
controlPanel = new ControlPanel();
mainPanel.add(gamePanel, BorderLayout.CENTER);
mainPanel.add(controlPanel, BorderLayout.SOUTH);
mainPanel.revalidate();
这是预期在重绘时调用的代码:
protected void paintComponent(Graphics pen){
if(started){
int count=0;
for (MapCell c:coms){
if (c.type!='w'){
count++;
}
c.paint(pen);
}
System.out.println("White space: " +count);
System.out.println("Components: "+coms.size());
for(Anno an:mapGen.ans){
an.draw(pen,img,colWidth,rowHeight);
}
}
迷宫生成后打印语句工作正常,但仅绘制图像“Anno”并在其后留下痕迹。我已确认该列表正在获取正确的数据。
【问题讨论】:
-
您在组件上调用
repaint()以强制对其进行重绘。 -
@camickr 我试过了,但它甚至没有调用paintComponent。
-
那么你的代码有问题。面板必须显示在可见的 GUI 上,并且大小必须大于零。也许您刚刚创建了面板并将其添加到 GUI,但没有 revalidate() 父面板。
-
@camickr 不,代码现在在帖子中
-
@Gregor:尝试使用 repaint() 而不是 revalidate():stackoverflow.com/questions/1097366/… - 我也没有在任何地方看到“setVisible(true)”。你确定你真的在启用你的用户界面吗?