использование Graphics g во внутреннем классе в java

Почему я не вижу следующий вывод?

g2.drawString(новая дата().toString(), 0, 150);

(я использовал g2 (глобальную переменную) для использования g в методе рисования во внутреннем классе).

Thanks a lot in advance!

    public class RedRect extends Frame
    {
public static void main(String[] args){ SwingUtilities.invokeLater(new Runnable() {

@Override public void run() { new RedRect(); } }); } public static Point p; RedRect() { super("RedRect"); try{ addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.exit(0);}}); setSize (800, 600); add("Center", new CvRedRect()); show(); } catch(Exception ex){ } } } class CvRedRect extends Canvas { Vector<Point> v=new Vector<Point>(); CvRedRect(){ addMouseListener((new MouseAdapter() { public void mousePressed(MouseEvent evt){ if(v.size()<3){ v.add(evt.getPoint()); } else{ flag=false; //v.removeElementAt(0); //v.add(evt.getPoint()); } p=evt.getPoint(); repaint(); } })); } Point p=new Point(); boolean flag=true; int i=0; public static Graphics g2; public void paint(Graphics g) { try{ g2=g; Dimension d = getSize(); int maxX = d.width - 1, maxY = d.height - 1; g.setColor(Color.red); g.drawRect(0, 0, maxX, maxY); g.drawString("x ="+p.x, 10, 30); g.drawString("y = " +p.y, 10, 60); if(v.size()>2){ g2.drawLine(v.get(0).x,v.get(0).y,v.get(1).x,v.get(1).y); g2.drawLine(v.get(0).x,v.get(0).y,v.get(2).x,v.get(2).y); g2.drawLine(v.get(1).x,v.get(1).y,v.get(2).x,v.get(2).y); Thread t=new Thread(){ public void run(){ try{ while(flag){ ///The following comand////// g2.drawString(new Date().toString(), 0, 150); /////////////////////////// Thread.sleep(300); System.out.println (v.size()); Thread.sleep(300); } } catch(Exception ex){ System.out.println (ex.getMessage()); } } }; t.start(); } //System.out.println ("size="+v.size()); if(!flag){ g.clearRect(0,0,maxX,maxY); Thread.sleep(1000); g.drawString("FINISH", 5, 30); flag=true; } } catch(Exception ex){ } } }


person Sasool    schedule 21.10.2013    source источник


Ответы (1)


Причина, по которой ваш код не работает, заключается в том, что вы неправильно используете графику. Объект Graphics не должен быть полем класса, тем более статическим. Это не долгоживущий объект, поэтому, если вы попытаетесь сохранить его таким образом, вы получите либо нулевую ссылку, либо ненулевую ссылку, которая не работает.

Вместо этого, если ваша программа является программой AWT, используйте объект Graphics внутри метода рисования, где JVM предоставляет его вам при вызове рисования. В противном случае, если Swing сделает то же самое с методом paintComponent.

Предложения:

  • Прежде всего, не кодируйте AWT, если это не является абсолютным требованием для класса. Вместо этого используйте Swing.
  • Затем прочитайте учебные пособия по графике Swing, поскольку они научат вас всему этому и многому другому.
  • Затем сделайте свой рисунок в перегрузке paintComponent(...) JPanel или другого компонента, который расширяет JComponent.
  • Не забудьте вызвать метод super.paintComponent(g) в своем переопределении.
  • Не забудьте аннотировать переопределение аннотацией @Override.
  • Используйте Swing Timer, чтобы делать то, что вы в настоящее время используете для цикла while и Thread.sleep(...).
person Hovercraft Full Of Eels    schedule 21.10.2013
comment
Я хочу, чтобы моя программа могла выполнять некоторые графические операции внутри основного фрейма и также могла получать ввод пользователя (получать точку, щелкая). По этой причине я использую thread. пожалуйста, помогите мне! - person Sasool; 22.10.2013
comment
@user2904975 user2904975: решать одну проблему за раз. Я ответил на ваш первоначальный вопрос: дизайн вашей программы неверен, и вам лучше делать то, что я рекомендую в моих предложениях. Если у вас есть новый конкретный другой вопрос, то обязательно задайте его, но предоставьте всю необходимую информацию, чтобы мы могли на него ответить. - person Hovercraft Full Of Eels; 22.10.2013