2016-03-29 3 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, компоненты swing также по умолчанию буферизуются по умолчанию. Теперь, сказав все это, ваша попытка двойной буферизации, как правило, неверна, вы должны использовать 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), если это помогло решить проблему. –