2013-07-12 2 views
2

У меня есть код:Почему моя перекраска не работает?

import java.applet.Applet; 
import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class obj_Dingus 
extends Applet 
implements KeyListener{ 

    private Rectangle rect; //The rectangle that we move 

    public void init() 
    { 
     this.addKeyListener(this); 
     rect = new Rectangle(0, 0, 50, 50); 
    } 

    public void paint(Graphics g) 
    { 
     setSize(500,500); 
     Graphics2D g2 = (Graphics2D)g; 
     g2.fill(rect); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     repaint(); 
     if (e.getKeyCode() == KeyEvent.VK_RIGHT){ 
      rect.setLocation(rect.x + 2, rect.y); 
     } if (e.getKeyCode() == KeyEvent.VK_LEFT){ 
      rect.setLocation(rect.x - 2, rect.y); 
     } if (e.getKeyCode() == KeyEvent.VK_UP){ 
      rect.setLocation(rect.x, rect.y - 2); 
     } if (e.getKeyCode() == KeyEvent.VK_DOWN){ 
      rect.setLocation(rect.x, rect.y + 2); 
     } 
     repaint(); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 
} 

Насколько я могу судить, он должен сделать черный ящик, который перемещается по экрану, но вместо того, чтобы экран не обновляется, а старые коробки не очищены. Он заканчивается гигантской черной линией на экране, и я понятия не имею, что я делаю неправильно, я новичок.

+0

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. Если вам необходимо поддерживать более старые API на основе AWT, см. [Смешивание тяжеловесных и легких компонентов] (http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html). –

+0

В краске вы можете сделать g2.clearRect(); – eliteslayer

ответ

1
public void paint(Graphics g) 
{ 
    setSize(500,500); 
    Graphics2D g2 = (Graphics2D)g; 
    g2.fill(rect); 
} 

Никогда ничего в методе paint(Graphics), что может привести к графическому интерфейсу пользователя repaint() позвонить. Добавление компонентов, изменение содержимого компонентов или , установка размера GUI всего триггера repaint(), поэтому этот апплет переходит в бесконечный цикл.

Это должно быть больше вдоль линий:

public void paint(Graphics g) 
{ 
    super.paint(g); // always call the parent method 1st.. 
    Graphics2D g2 = (Graphics2D)g; 
    g2.fill(rect); 
} 
+0

большое спасибо, теперь я понимаю лучше – user2577576

Смежные вопросы