2017-05-16 39 views
1

我试图用2D数组着色JFrame来为学校项目创建一个“地图”网格。 问题是,在框架的(0,0)位置,出现一个随机的灰色框,将所有内容推向右边。它甚至将最后一块推到了下一排的第一个位置,这让我非常困惑。JFrame中的矩形创建没有明显的原因右移

我考虑到数组以索引“0”开头的事实,我想知道为什么它不在(0,0)位置绘制黑盒子。

下面是两种相关的类在我的代码:

public class Floor1Components extends JComponent { 
    public void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 

    for (int y = 0; y < Map.floor1Schematics.length; y++) { //for every row 

     for(int x = 0; x < Map.floor1Schematics[0].length; x++) { //do something for every column 
      Rectangle block = new Rectangle((x*50), (y*50), 50, 50); 
      g2.draw(block); 
      g2.fill(block); 
      if(Map.floor1Schematics[y][x].equals("wl")) { 
       g2.setColor(Color.BLACK); 
      } 
      if(Map.floor1Schematics[y][x].equals("gr")) { 
       g2.setColor(Color.GREEN); 
      } 
      if(Map.floor1Schematics[y][x].equals("end")) { 
       g2.setColor(Color.RED); 
      } 
      if(Map.floor1Schematics[y][x].equals("ch")) { 
       g2.setColor(Color.YELLOW); 
      } 
      if(Map.floor1Schematics[y][x].equals("pv")) { 
       g2.setColor(Color.GRAY); 
      } 
     } 

    } 
} 

}

public class Map { 

public static boolean floor1 = true; 
public static boolean floor2 = false; 
public static boolean floor3 = false; 

public static JFrame frame = new JFrame(); 

public static String floor1Schematics[][] = 
    { 
{"wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl"}, 
{"wl","gr","gr","gr","wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl","gr","gr","gr","wl"}, 
{"wl","gr","ch","gr","wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl","gr","ch","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","wl","wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl","wl","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","pv","pv","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","pv","pv","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","wl"}, 
{"wl","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","pv","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","pv","pv","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","pv","pv","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","wl","wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl","wl","wl"}, 
{"wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl"}, 
{"wl","gr","ch","gr","wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl","gr","ch","gr","wl"}, 
{"wl","gr","gr","gr","wl","gr","gr","gr","gr","gr","gr","gr","gr","gr","pv","pv","gr","gr","gr","gr","gr","gr","gr","gr","gr","wl","gr","gr","gr","wl"}, 
{"wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl","wl"}, 

    }; 

public static void createFrame() { 

    frame.setSize(1600,1600); 
    frame.setTitle("Frame"); 
    frame.setResizable(false); 
    //frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
    //PlayerModel player = new PlayerModel(); 
    //frame.add(player); 
    //frame.setVisible(true); 
    if (floor1 && !floor2 && !floor3) { 
     Floor1Components floor1 = new Floor1Components(); 
     frame.add(floor1); 
     frame.setVisible(true); 
    } 
} 

public static void main(String[] args) { 
    createFrame(); 
} 

}

道歉即2D阵列暴行,即对于着色和检测你站在什么地方。但我很困惑,为什么一切都被推到了正确的位置,然后又被放倒了。我已经完成了数千次块创建和索引推荐的数学计算。

+0

您是否在绘制/填充矩形之前尝试设置颜色 – MadProgrammer

+0

是的,这工作。非常感激! –

回答

1

我想你应该把

 g2.draw(block); 
     g2.fill(block); 

您setcolors后,如果我没有记错。

对于第一个元素,您正在绘制一个框,然后设置颜色。让我知道这是否有帮助。如果你有主要的方法代码,我愿意进一步帮助。

+0

哦,我的天啊。谢谢。我一直在研究这个bug一个星期,甚至对它进行硬编码,这导致了更多的问题,并且都是因为这个原因。你能向我解释为什么这有效吗?我不想再犯这种相同的错误。非常感谢。 –

+0

据我所知,它是这样的(使用真实世界的物品,例如):默认情况下,你拿起一支灰色的铅笔。如果你想绘制一些东西,它会把它画成灰色。你需要选择你想要绘制的正确的彩色铅笔,然后画出你需要的东西。不太确定它为什么被抵消,但实际的代码需要更多的调试。 另外你可能不需要g2.draw,只需g2.fill。 – user2980932

+0

看起来像刚刚从for循环工作的偏移量来看我所看到的。 – user2980932