2013-11-04 73 views
2

我正在创建一个小的JPanel程序来生成迷宫。我所有的代码都可以工作,但是我想要在操作中显示迷宫一代。我编辑了我的程序,使paintComponent函数显示进行中的迷宫。但是我在另一个正在传递我的JPanel对象的类中,所以它可以“刷新”显示。如何刷新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”被绘制出来,并在它后面留下一条痕迹。我已确认列表正在获取正确的数据。

+2

您可以在组件上调用repaint()来强制重绘它。 – camickr

+0

@camickr我已经尝试过,但它甚至没有调用paintComponent。 – Others

+1

然后你的代码有问题。该面板必须显示在可见的GUI上,并且其大小必须大于零。也许你只是创建了面板并将其添加到GUI,但没有重新验证()父面板。 – camickr

回答

2

现在单元格现在可以正确渲染,但它在算法期间仍然不显示。

您的计算可能会阻塞事件分派线程。相反,使用SwingWorker在后台线程中迭代您的算法,如hereherepublish()中期结果process()可用于更新面板。