2015-04-03 3 views
1

У меня есть объект JPanel, в котором я использую его в качестве холста для рисования прямоугольных фигур и звоня по методу updateString(String c, int x, int), чтобы нарисовать код String c всякий раз, когда я называю этот метод в своей основной.Метод drawString не работает

У меня также есть локальная переменная 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; 

Вы не хотите сохранить графический объект в поле, так как этот объект не является длительным, и это приведет к графическим сбоям или НЭП или хуже ,

Вместо либо

  • ли рисунок непосредственно в методе paintComponent. Это можно сделать, скажем, создать List<String> и сохранить ваши строки в этом списке, а затем итерировать через список внутри paintComponent, рисуя каждую строку.
  • Или нарисуйте в BufferedImage, который затем нарисован в методе paintComponent.
  • Или введите текст в текстовый компонент, например JLabel или JTextArea.
+0

Ага Так он просто заканчивается, когда метод закончен. Но есть ли способ сделать этот рисунок внутри другого метода? –

+0

@VerumInfiniti: Почему бы просто не поставить JLabel посередине и не задать свой текст? –

+0

Поскольку мое задание мне так говорило, я все равно сделаю это на вашем пути. Тем не менее, я рассмотрел это, но не мог быть уверен, потому что думал, что должен быть способ сделать эту легкую вещь drawString. –

Смежные вопросы