1

我有一个使用线程的 Java 程序。在我的运行方法中,我有:

public void run() {
    while(thread != null){
        repaint();
        System.out.println("hi");
        try {  
            Thread.sleep(1000);  
        } catch (InterruptedException e) {  
            break;  
        }  
    }
}

public void paintComponent(Graphics g) {
    // painting stuff
}

问题是执行了 run 方法,但paintComponent没有调用该部分。如果这不是继续重绘组件的正确方法,那么我应该如何重绘它?

4

4 回答 4

5

Cal 从 Swing 重新绘制Timer。这不会阻塞 GUI,并且会在计时器中指定的任何时间间隔发生。当然,根据 Swing/AWT 绘画的性质,如果计时器设置的重复太快,则可能会合并对绘画的调用(实际上被忽略)。

此外,请确保该方法一个覆盖使用:

@Override
public void paintComponent(Graphics g){
于 2012-04-30T01:56:21.267 回答
3

您应该只在需要时(即更新它时)重新绘制组件。

于 2012-04-30T01:28:33.817 回答
1

根据您在做什么,您可能也对此感兴趣。这取自Andrew Davison 的Killer Game Programming in Java。他谈到了主动渲染。您的游戏循环实际上是:

public void run()
{
  while (running)
  {
    gameUpdate();                             // game state is updated
    gameRender();                             // render to a buffer
    paintScreen();                            // draw buffer to screen

    try
    {
      Thread.sleep(20);
    }
    catch (InterruptedException e) {;}
  }
}

而且,画屏的实现是(由 的子类定义JComponent):

private void paintScreen()
{
  final Graphics2D g2d;

  try
  {
    g2d = (Graphics2D) this.getGraphics();
    if (g2d != null && (backbuffer != null))
    {
      g2d.drawImage(backbuffer, 0, 0, null);
    }

    Toolkit.getDefaultToolkit().sync();       // sync the display on some systems [1]
    g2d.dispose();
  }
  catch (Exception e)
  {
    ;
  }
}

从书中:

[注 1]调用Tookkit.sync()确保显示及时更新。这是 Linux 所必需的,它不会自动刷新其显示缓冲区。如果没有sync()调用,动画可能只会部分更新,从而产生“撕裂”效果。

于 2012-04-30T05:03:31.843 回答
-1

对于 JFrame 等重量级容器,您必须调用 paint(g)。您为 JButton 之类的轻量级容器调用 paintComponent(g)。看看这是否有效。

于 2012-05-01T03:05:36.410 回答