为什么我看不到以下输出?
g2.drawString(new Date().toString(), 0, 150);
(我使用g2(全局变量)在内部类的paint方法中使用g)。
提前非常感谢!
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){ } } }
最佳答案
您的代码无法正常工作的原因是您使用的图形错误。 Graphics 对象不应该是一个类字段,更不用说静态字段了。它不是一个长期存在的对象,因此如果您尝试让它以这种方式持久存在,您最终会得到一个无效的空引用或一个不起作用的非空引用。
相反,如果您的程序是 AWT 程序,请在 Paint 方法内使用 Graphics 对象,JVM 在调用 Paint 时会向您提供该对象。否则,如果 Swing 也使用 PaintComponent 方法执行同样的操作。
建议:
- 首先,不要编写 AWT 代码,除非这是类的绝对要求。而是使用 Swing。
- 接下来阅读 Swing 图形教程,因为它们会教您所有这些以及更多内容。
- 接下来在
paintComponent(...)
内进行绘图JPanel 或其他扩展 JComponent 的组件的重载。 - 别忘了调用
super.paintComponent(g)
重写中的方法。 - 不要忘记用
@Override
注释您的覆盖。注释。 - 使用 Swing 计时器来执行当前使用 while 循环和
Thread.sleep(...)
的操作要做的事。
关于java - 在java的内部类中使用Graphics g,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19506723/