2014-05-02 5 views
0

Я пишу небольшой JAVA-апплет.Java-апплет не отвечает правильно

Который получает случайное число от 1 до 6 и печатает их на экране APPLET. Что я хочу сделать ... Петля 50 раз на экране и печатать различные номера рандов. [При каждом изменении предыдущего номера].

И после этого цикла .. Он печатает любой 1 окончательное случайное число на апплета ..

Моя проблема заключается в следующем: петля. Он печатает все номера по каждому каналу, и экран не получает . Что не так? Я пробовал много методов очистки экрана апплета, например, рисования прямоугольника или использования функции clearRect(). Ничего не работает. Вот код.

import java.applet.Applet; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.util.Random; 



public class Shapes extends Applet{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    Random r = new Random(); 
    Dimension d = getSize(); 
    Font f = new Font("TimesRoman", Font.BOLD, 96); 
    public void paint(Graphics g) 
    { 
     for(int m=0;m<=50;m++){  
       int k = Math.abs((r.nextInt()) % 6) + 1; 
       g.setFont(f); 
       g.setColor(Color.BLACK); 
       g.drawString(String.valueOf(k) , 70, 100); 
       g.setColor(Color.WHITE); 
       g.drawRect(0, 0, d.width, d.height); 
       try{Thread.sleep(70);}catch(Exception e){} 
     } 



    } 

} 
+1

1) Почему код апплета? Если это связано со спецификацией. учителем, пожалуйста, обратитесь к [Почему учителя CS должны прекратить преподавать Java-апплеты] (http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should-stop-teaching-java-applets/). 2) Почему AWT, а не Swing? См. Мой ответ на [Swing extras over AWT] (http://stackoverflow.com/a/6255978/418556) по многим причинам, чтобы отказаться от использования компонентов AWT. –

ответ

1

Дело в том, что при создании объекта апплет не имеет размера, поэтому вы должны подождать, чтобы получить размер апплета. Например, во время рендеринга, как это:

public void paint(Graphics g) 
{ 
    d = getSize(); 
    for(int m=0;m<=50;m++){ 
     g.clearRect(0, 0, (int) d.getWidth(), (int) d.getHeight()); 

     int k = Math.abs((r.nextInt()) % 6) + 1; 
     g.setFont(f); 
     g.setColor(Color.BLACK); 
     g.drawString(String.valueOf(k) , 70, 100); 
     try{Thread.currentThread().sleep(70);}(Exception e){} 
    } 
} 
+0

Спасибо большое .. Это сработало, и я понял концепцию отлично .. :) –

+0

Я до сих пор не думаю, что 'Thread.sleep' на EDT - хорошая идея ... – DankMemes

+0

Я по вашему мнению @ZoveGames , Это правда, не рекомендуется (это плохо), вызывающий sleep() в EDT ;-). На самом деле правильный ответ - это смешение обоих ответов (ваше и мое). Ваш для приуроченного звонка от внешнего EDT и моего для вопроса getSize() С уважением, –

1

Помните, что paint(Graphics) является на событие отправки нить так спать она будет замерзать весь пользовательский интерфейс. Вы должны использовать асинхронные перерисовки так:

public void init(){ 
    Timer t=new Timer(70, new ActionListener(){ 
     public void actionPerformed(ActionEvent e){repaint();} 
    }); 
    t.setCoalesce(true); 
    t.setRepeats(true); 
    t.start(); 
} 
public void paint(Graphics g){...} 
+0

Да, я не полностью прочитал вопрос, извините. Однако это все же лучшая практика. – DankMemes

1
public void paint(Graphics g) 
{ 
    // .. 

Должно быть:

public void paint(Graphics g) 
{ 
    super.paint(g); // VERY IMPORTANT! Draw BG and borders etc. 
    // .. 
Смежные вопросы