【问题标题】:How to refresh a JPanel?如何刷新JPanel?
【发布时间】: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)”。你确定你真的在启用你的用户界面吗?

标签: java swing jpanel


【解决方案1】:

现在单元格现在可以正确渲染,但在算法过程中仍然不显示。

您的计算可能阻塞了事件调度线程。相反,使用SwingWorker 在后台线程中迭代您的算法,如herehere 所示,以及publish() 中间结果process() 可用于更新您的面板。

【讨论】:

    猜你喜欢
    • 2014-08-22
    • 2010-10-14
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多