0

为什么我看不到以下输出?

g2.drawString(new Date().toString(), 0, 150);

(我使用g2(全局变量)在内部类的paint方法中使用g)。

提前非常感谢!

    公共类 RedRect 扩展 Frame
    {
公共静态无效主要(字符串[]参数){ 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){ } } }

4

1 回答 1

4

您的代码无法正常工作的原因是您使用错误的图形。Graphics 对象不应是类字段,更不应是静态字段。它不是一个长期存在的对象,因此如果你试图让它以这种方式持续存在,你最终会得到一个无效的空引用或非空引用。

相反,如果您的程序是 AWT 程序,则在 JVM 调用paint 时提供给您的 paint 方法中使用 Graphics 对象。否则,如果 Swing 对 paintComponent 方法做同样的事情。

建议:

  • 首先,不要编码 AWT,除非这是一个类的绝对要求。而是使用 Swing。
  • 接下来阅读 Swing 图形教程,因为它们会教您所有这些以及更多内容。
  • 接下来在paintComponent(...)JPanel 或扩展 JComponent 的其他组件的重载中进行绘图。
  • 不要忘记super.paintComponent(g)在覆盖中调用该方法。
  • 不要忘记使用注释来注释您的覆盖@Override
  • 使用 Swing Timer 来执行您当前正在使用的 while 循环并Thread.sleep(...)执行的操作。
于 2013-10-21T23:50:10.317 回答