0

次の出力が表示されないのはなぜですか?

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

(内部クラスのペイントメソッドでgを使用するためにg2(グローバル変数)を使用しました)。

よろしくお願いします!

    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){ } } }

4

1 に答える 1

4

コードが機能しない理由は、Graphics を間違って使用しているためです。Graphics オブジェクトは、クラス フィールドであってはならず、静的なものであってはなりません。これは長寿命のオブジェクトではないため、この方法で永続化しようとすると、null 参照または機能しない非 null 参照のいずれかになります。

代わりに、プログラムが AWT プログラムの場合は、paint メソッド内で Graphics オブジェクトを使用します。このオブジェクトは、JVM が paint を呼び出すときに提供されます。それ以外の場合は、Swing が paintComponent メソッドで同様に行います。

提案:

  • 何よりもまず、クラスの絶対要件でない限り、AWT をコーディングしないでください。代わりに Swing を使用してください。
  • 次に、Swing グラフィックスのチュートリアルを読んでください。これらすべてと、それ以上のことが学べます。
  • 次にpaintComponent(...)、JPanel または JComponent を拡張する他のコンポーネントのオーバーロード内で描画を行います。
  • super.paintComponent(g)オーバーライド内でメソッドを呼び出すことを忘れないでください。
  • オーバーライドに注釈を付けることを忘れないでください@Override
  • Swing Timer を使用して、現在 while ループを使用していることをThread.sleep(...)実行します。
于 2013-10-21T23:50:10.317 に答える