为什么我看不到以下输出?
g2.drawString(new Date().toString(), 0, 150);
(我使用 G2(全局变量)在内部类的 paint 方法中使用 g)。
提前非常感谢!
公共类 RedRect 扩展框架
{ 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){ } } }
您的代码不起作用的原因是您使用了错误的图形。图形对象不应是类字段,而不应是静态字段。它不是一个长期存在的对象,因此,如果您尝试以这种方式保留它,则最终会得到一个空引用或一个不起作用的非空引用。
相反,如果您的程序是 AWT 程序,请使用 paint 方法中的 Graphics 对象,JVM 在调用 paint 时为您提供它。否则,如果 Swing 也使用 paintComponent 方法。
建议:
- 首先,不要编写AWT,除非这是类的绝对要求。请改用 Swing。
- 接下来阅读 Swing 图形教程,因为它们将教您所有这些以及更多内容。
- 接下来,在 JPanel 或其他扩展 JComponent 的组件的
paintComponent(...)
重载中绘制。 - 不要忘记在重写中调用
super.paintComponent(g)
方法。 - 不要忘记使用
@Override
注释来注释您的覆盖。 - 使用摆动计时器执行当前正在使用的 while 循环和
Thread.sleep(...)
执行的操作。