Java 为什么我的图形代码不';除非代码块中有System.out.println,否则无法运行?

Java 为什么我的图形代码不';除非代码块中有System.out.println,否则无法运行?,java,graphics,println,Java,Graphics,Println,我有一个方法paint(),它接收一个Graphics2D参数。奇怪的是,除非存在System.out.println(我在下面的块中对此进行了注释),否则画布不会绘制任何内容 public class Map{ public void paint(Graphics2D g){ //fill background to black g.setColor(Color.black); g.fillRect(0, 0, TILE_SIZE*W

我有一个方法paint(),它接收一个Graphics2D参数。奇怪的是,除非存在System.out.println(我在下面的块中对此进行了注释),否则画布不会绘制任何内容

public class Map{

    public void paint(Graphics2D g){

        //fill background to black
        g.setColor(Color.black);
        g.fillRect(0, 0, TILE_SIZE*WIDTH, TILE_SIZE*HEIGHT);

        //draw the tiles and buildings

        for(int i=0;i<WIDTH;i++){
            for(int j=0;j<HEIGHT;j++){
                if(map[j][i] == CLEAR){
                    //System.out.println("");
                    g.setColor(Color.gray);
                    g.fillRect(i*TILE_SIZE, j*TILE_SIZE, TILE_SIZE, TILE_SIZE);
                    g.setColor(Color.red);
                    g.drawRect(i*TILE_SIZE, j*TILE_SIZE, TILE_SIZE, TILE_SIZE);

                }
            }
        }
    }
}

这段代码来自Canvas类。正如您所看到的,paint()方法与Canvas类(我将其命名为GameTest)是分开的。因此,如果我注释掉println语句,则画布中不会显示任何图形,否则会正确显示。任何人都可以帮助我吗?

您应该使用SwingUtilities切换到事件调度线程(EDT),请参见下文。几乎所有与AWT和Swing类的交互都需要这样做

  SwingUtilities.invokeLater(new Runnable(){
      public void run(){
          new MapTest();
      }    
   }

请注意,这使用了swing助手库,这对AWT来说应该很好,但更好的是开始使用swing。

我想到的一件事是,我在这方面有类似的问题,并且发现
System.out.println()
导致线程同步。我知道这是一个严重的问题,你需要一些答案,但当我读到你的问题主题时,我忍不住大笑:)是的,听起来像是线程同步问题。我猜您是从事件调度线程以外的线程调用它,这是大多数此类错误的原因。看一看关于这个主题的非常好的讨论。为了更快地获得更好的帮助,请发布一篇文章。在这个千年里,你为什么要使用基于AWT的
画布
&
框架
?链接到不同方法的维基百科文章。感谢你的回答,但它仍然没有显示任何内容:(我想问题不在于线程同步。事实上,我的代码基于cokeandcode.com的教程,该站点的代码运行得非常好!(没有invokeLater()的东西)当您使用swing中的
JPanel
时,您可以测试它是否正常工作。(让您的Map类扩展JPanel并将其添加到JFrame中)默认情况下,JPanel是双缓冲的,绘制函数看起来是兼容的。这样你就可以看到问题是否出在BufferedStrategy中。它起作用了!!我将映射更改为JPanel,并将其添加到JFrame中,删除所有BufferStrategy内容,一切正常!所以BufferStrategy中的问题是正确的??但有什么可能是错误的??为什么Ffferstrategy搞砸了println()?嗯,可能还有另一个同步问题或竞争条件,即从错误的线程运行它,我对BufferedStrategy没有太多经验。我找到了解决方案!将我所有的绘图内容放在一个循环中解决了问题。在我看来,如果你试图使用BufferedStrategy绘制单个屏幕,它可能会搞糟。顺便说一下我使用双缓冲。这和我的问题有关吗?
  SwingUtilities.invokeLater(new Runnable(){
      public void run(){
          new MapTest();
      }    
   }