2015-04-03 120 views
1

我有一个JPanel对象,我使用它作为绘制矩形形状的画布,并且每当我在我的main中调用该方法时,调用updateString(String c, int x, int)方法绘制一个String cdrawString方法不起作用

我的代码顶部也有一个名为private Graphics page;的局部变量。下面是updateString()方法:

public void updateString(String c, int ind1, int ind2) 
{ 
    for(int i = 0; i < Math.pow(DIMENSION, 2); i++) 
     if(grid[i].contains(new Point(ind1, ind2))) 
     { 
      page.drawString(c, (int) grid[i].getCenterX(), (int) grid[i].getCenterY()); 
      repaint(); 
      return; 
     } 
} 

电网[]是我Rectangle对象的数组存储Rectangle对象的数据,我实际上把他们我paintComponent()方法内。

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    page = g; 
    for(int i = 0; i < Math.pow(DIMENSION, 2); i++) 
    { 
     g.drawRect(grid[i].x, grid[i].y, grid[i].width, grid[i].height); 
    } 
} 

,我不能说明白点就是为什么每当我叫updateString()方法,它只是不更新​​,并把字符串在我最初绘制的矩形的中间?

谢谢。

回答

4

这是非常非常错误的:

page = g; 

你不想保存Graphics对象,因为这个对象的字段是不是持久的,这将导致图形故障或NPE的或更糟。

而是要么

  • 直接做你的图纸你的paintComponent方法。这可以通过创建一个List<String>并将您的字符串存储到此列表中,然后遍历paintComponent中的列表并绘制每行来完成。
  • 或在BufferedImage中绘制,然后在paintComponent方法中绘制该图像。
  • 或者将您的文本放在一些文本组件中,如JLabel或JTextArea。
+0

啊哈所以它只是当方法结束时自行终止。但是有什么方法可以在另一种方法中进行绘图吗? – 2015-04-03 12:03:40

+0

@VerumInfiniti:为什么不在中间放一个JLabel并设置它的文本? – 2015-04-03 12:05:29

+0

因为我的任务是这样告诉我的,无论如何,我会按照你的方式去做。我之前已经考虑过,但是,不能确定,因为我认为必须有一种方法来做这个简单的drawString事情。 – 2015-04-03 12:08:07