java - 在java的内部类中使用Graphics g

标签 java swing graphics awt

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

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/

相关文章:

java - 球互相跟随落下

使用卷积的 Android 中值滤波器

宽度为 1 的 Qt drawLine

java - 实现集合及其顺序时使用的实际数据结构是什么?

java - 使用 eclipse 导出可运行的 jar

java - 失败 - 上下文路径/MyProject 中的应用程序无法启动(JndiException 和 NameNotFoundException)

java - 关于将Java的计算器程序转换为Exe文件

c# - 如何从 StreamGeometry 中提取 Point 对象?

java - 使用 Java 的简单 ASCII 编码 Q

java - HttpMessageConverter 无效 EOF 处理