drawString方法不起作用

时间:2015-04-03 11:57:36

标签: java swing jpanel paintcomponent drawstring

我有一个JPanel对象,我将其用作绘制矩形形状的画布,并且只要我在主要方法中调用该方法,就调用updateString(String c, int x, int)方法绘制String c

我的代码顶部还有一个名为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;
        }
}

grid [] 是我的Rectangle对象'数组,用于存储Rectangle对象的数据,我实际上是在paintComponent()方法中绘制的。< / p>

@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()方法时,它只是不更新​​并将String放在我最初绘制的矩形的中间?

谢谢。

1 个答案:

答案 0 :(得分:4)

这是非常错误的:

page = g;

您不希望将Graphics对象保存到字段中,因为此对象不会持久,这会导致图形故障,或NPE或更糟。

而不是

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