drawString 方法不起作用
drawString method doesn't work
我有一个 JPanel
对象,我将其用作 canvas 来绘制矩形形状,并调用 updateString(String c, int x, int)
方法来绘制 String c
每当我在我的 main 中调用该方法。
我的代码顶部还有一个名为 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()
方法。
@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()
方法时,它只是不更新并将字符串放在我最初绘制的矩形的中间?
谢谢。
这是非常非常错误的:
page = g;
您不想将 Graphics 对象保存到字段中,因为该对象不是持久的,这会导致图形故障,或 NPE 或更糟的情况。
而是
- 直接在 paintComponent 方法中绘制。这可以通过创建一个
List<String>
并将您的字符串存储到此列表,然后遍历 paintComponent 内部的列表,绘制每一行来完成。
- 或者在BufferedImage中绘制,然后在paintComponent方法中绘制。
- 或者将您的文本放在一些文本组件中,例如 JLabel 或 JTextArea。
我有一个 JPanel
对象,我将其用作 canvas 来绘制矩形形状,并调用 updateString(String c, int x, int)
方法来绘制 String c
每当我在我的 main 中调用该方法。
我的代码顶部还有一个名为 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()
方法。
@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()
方法时,它只是不更新并将字符串放在我最初绘制的矩形的中间?
谢谢。
这是非常非常错误的:
page = g;
您不想将 Graphics 对象保存到字段中,因为该对象不是持久的,这会导致图形故障,或 NPE 或更糟的情况。
而是
- 直接在 paintComponent 方法中绘制。这可以通过创建一个
List<String>
并将您的字符串存储到此列表,然后遍历 paintComponent 内部的列表,绘制每一行来完成。 - 或者在BufferedImage中绘制,然后在paintComponent方法中绘制。
- 或者将您的文本放在一些文本组件中,例如 JLabel 或 JTextArea。