2016-02-21 4 views
1
package games; 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*;  

public class viza extends JPanel implements ActionListener {  

/** 
    * 
    */ 
    private static final long serialVersionUID = 1L;  
    int x=0, y=200; 
    Timer tm =new Timer(5,this);  
    public viza(){  
     tm.start();  
    }  
    public void paintComponent(Graphics g){  
     g.setColor(Color.red);  
     g.fillRect(x, y, 20, 20);  
    }  
    public void actionPerformed(ActionEvent e){ 
     x=x+1; 
     y=y+1; 
     if(x>300)  
      x=0;  
     if(x<0) 
      x=0;   
     repaint(); //after x and y are changet then I use repaint(); 
    }  // the frame is created and the new object is added into the frame. 
    public static void main(String[] args){  
     viza a=new viza();  
     JFrame frame = new JFrame();  
     frame.setSize(500,500);   
     frame.add(a);  
     frame.setVisible(true);   
    }  
}[1]  

Код используется для рисования заполненного прямоугольника на панели. Однако, когда я запускаю программу, объект перемещается, но панель не перекрашивается. Если я попытаюсь изменить размер окна во время запуска программы, он загрузится правильно. Как только я перестаю делать это, панель или рамка (не уверен) больше не перекрашиваются. Поэтому я заканчиваю линию.перекрасить() не работает в колебании

+0

И как вы думаете, когда-либо x станет меньше 0? –

ответ

2

Перед тем, как перерисовать прямоугольник в своей новой позиции, вы должны очистить панель.

Чтобы сделать это, пусть super.paintComponent() сделать это для вас, так как это будет правильный подход к пользовательской живописи в любом JComponent:

public void paintComponent(Graphics g){  
    super.paintComponent(g); // let it do the default paint 
    g.setColor(Color.red);  
    g.fillRect(x, y, 20, 20);  
} 

Также вы можете добавить операцию закрытия по умолчанию к раме (в основном методе) для выхода из программы после закрытия кадра:

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

Еще один совет, чтобы установить больший timeout для таймера, потому что 5 миллисекунды происходит очень быстро, и ваши нас er не видит движения. Попробуйте что-то большее, чем 50 или 100.

Удачи.

+0

Как всегда, вы правы @ AndrewThompson. Изменит ответ. – STaefi

+0

* «Отредактируйте ответ». * Хорошее редактирование. :) * «Как всегда ты прав ..» * LOL! Я хочу. Если бы я был, я бы записывал завтрашние номера лото. ;) –

+0

«Если бы я был, я бы записывал завтрашние номера лото»;) «LOL! :-D – STaefi

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