2016-03-29 9 views
0

私は本当にこれを理解することができず、私はあなたの助けが必要です。私は単純な アプレットを作成しました。私はパネルとキャンバスを持っています。私はキャンバスに描く。私はキャンバス をパネルに追加します。アプレットにパネルを追加します。 キャンバスに円を描こうとしていますが、見えません。アプレットのサイズを変更すると、円の後ろに円が表示されます( )。助けてください。キャンバスの円が見えない

 import java.applet.*; 
     import java.awt.*; 


     public class TestCanvas extends Applet implements Runnable 
     { 
      Panel myPanel = new Panel(); 
      int x = 50; 
      int y = 50; 
      int width = 100; 
      int height = 100; 
      boolean startBall = false; 

      Graphics bufferGraphics; 
      Image offscreen; 

      Thread t; 

      public void init() 
      { 
       canvas.setSize(500,500); 

       //canvas.setMaximumSize(new Dimension(500,500)); 
       //canvas.setMinimumSize(new Dimension(50,50)); 
       myPanel.add(canvas); 
       add(myPanel); 
       //For double buffering 
       offscreen = createImage(canvas.getWidth(),canvas.getHeight()); 
       bufferGraphics = offscreen.getGraphics(); 

      } 

      public void start() 
      { 
       t = new Thread(); 
       t.start(); 
       startBall = true; 

      } 

      public void stop() 
      { 
       t = null; 
      } 

      public void destroy() 
      { 
       t = null; 
      } 

      public void run() 
      { 
       for (; ;) 
       { 
        try 
        { 
         canvas.repaint(); 
         Thread.sleep(100); 
        }catch(InterruptedException e){} 



       } 
      } 

      class myCanvas extends Canvas 
      { 
       private static final long serialVersionUID = 1L; 

       public myCanvas() 
       { 
        setBackground(Color.yellow); 
        setSize(500, 300); 
        //setBounds(0, 0, 500, 300); 

       } 

      } 

      myCanvas canvas = new myCanvas(); 

      public void paint(Graphics g) 
      { 
       g = canvas.getGraphics(); 
       bufferGraphics.clearRect(0,0,canvas.getWidth(), canvas.getHeight()); 
       bufferGraphics.setColor(Color.black); 
       //x++; 
       //y++; 
       bufferGraphics.setColor(Color.black); 
       bufferGraphics.fillOval(x, y, width, height);  
       g.drawImage(offscreen,0,0,null);   
      } 

      public void update(Graphics g) 
      { 
       canvas.paint(g); 
      } 



     } 
+0

オブジェクトと機能の束を定義しました。あなたはどのようにこれらのアイテムに電話していますか? – zipzit

+0

アプレットが起動すると、自動的にスレッドが実行されます。ペイント法は、キャンバス上にボールをペイントします。しかし、ボールは背面に表示されます。私はそれがコンポーネントのグラフィックスを呼び出してコンポーネントを一時的にすることと関係があると思いますが、まだ理解できません。 –

+1

始めましょう。アプレットは死んだ技術で、ブラウザを積極的にブロックしたり、Javaプラグインを中止したりすることはほとんどありません。 awtは基本的に16年前のスイングに取って代わられていたので、BufferStrategyを使うつもりがなければ、本当にawtベースのコンポーネントを使う必要はなく、スイングコンポーネントもデフォルトでダブルバッファされています。さて、すべてのことを言っていると、ダブルバッファリングの試みは一般的に間違っています。BufferedImageを使用する必要があります。あなたの 'キャンバス'は実際に画面に表示されませんが、それはペイントしようとしているものです。 – MadProgrammer

答えて

1

それは質問をした人が、彼らはどちらか使用していた理由として合理的な回答を与えていたまで、私はアプレットやAWTのいずれかを伴う問題には触れないであろうステージに得ています。 OTOHは既にそれを部分的に果たしているので、ここではボールのアニメーション化の実例があります。

コードとこのコードの違いを注意深く見てください。

import java.applet.*; 
import java.awt.*; 

public class TestCanvas extends Applet implements Runnable { 

    Panel myPanel = new Panel(new GridLayout()); 
    int x = 0; 
    int y = 0; 
    int width = 100; 
    int height = 100; 
    boolean startBall = false; 
    myCanvas canvas = new myCanvas(); 
    Thread t; 

    public void init() { 
     myPanel.add(canvas); 
     System.out.println("" + this.getLayout()); 
     /* A Single component added to a no args GridLayout will be stretched 
     to fill the avilable space. */ 
     this.setLayout(new GridLayout()); 
     add(myPanel); 
     t = new Thread(this); 
     t.start(); 
    } 

    public void start() { 
     t = new Thread(); 
     t.start(); 
     startBall = true; 
    } 

    public void stop() { 
     t = null; 
    } 

    public void destroy() { 
     t = null; 
    } 

    public void run() { 
     for (;;) { 
      try { 
       canvas.repaint(); 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
      } 
     } 
    } 

    class myCanvas extends Canvas { 

     private static final long serialVersionUID = 1L; 

     public myCanvas() { 
      setBackground(Color.yellow); 
     } 

     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      g.clearRect(0, 0, getWidth(), getHeight()); 
      g.setColor(Color.black); 
      x++; 
      y++; 
      g.setColor(Color.black); 
      g.fillOval(x, y, width, height); 
     } 
    } 
} 
+0

問題を解決するのに役立ちましたら[回答を受け入れてください](http://meta.stackexchange.com/a/5235/155831)してください。 –

関連する問題