2014-07-04 5 views
0

Я пытаюсь рисовать автомобили, которые получают сгенерированные в ArrayList называется Cars внутри tryCar() метода он печатает правильный размер, когда я называю System.out.println(Cars.size());, но как только я пытаюсь сделать это внутри paint() метод не распознает его. Вот мой код. r является Random() от java.util.Randomкраски() не принимает обновленные переменные в Java

public void Update(){ 
    if(r.nextInt(100)>85){ 
     tryCar(); 
    } 
} 

void tryCar(){ 
    if(r.nextBoolean()){ 
     Car c = new Car(r.nextInt(2), r.nextInt(6)+6, r.nextBoolean()); 
     Cars.add(c); 
     cars++; 
     System.out.println(Cars.size()); 
    } 
} 

public void paint(Graphics g) { 
    super.paint(g); 
    this.setVisible(true); 
    this.setBackground(Color.BLACK); 
    Road.drawLvl(g); 
    System.out.println(Cars.size()); 
    g.fillRect(p1.X,p1.Y,p1.W,p1.H); 
    for(int i = 0; i<Cars.size(); i++){ 
     System.out.println("s"); 
     Car c = (Car) Cars.get(i); 
     g.setColor(new Color((r.nextInt(2)*255),(r.nextInt(2)*255),(r.nextInt(2)*255))); 
     g.fillRect(c.X,c.Y,c.W,c.H); 
    } 
} 

Вот весь класс:

public class Game extends JPanel { 
private static final long serialVersionUID = 1L; 
int CARS = 20; 
int cars = 0; 
ArrayList Cars = new ArrayList(); 
Player p1 = new Player(20,20); 
Environment Road = new Environment(1); 
Random r = new Random(); 
public void Update(){ 
    System.out.println("c"); 
    if(r.nextInt(100)>85){ 
     System.out.println("e"); 
     tryCar(); 
    } 
    p1.Move(Main.c); 
} 
void tryCar(){ 
    if(r.nextBoolean()){ 
     System.out.println("v"); 
     Car c = new Car(r.nextInt(2), r.nextInt(6)+6, r.nextBoolean()); 
     Cars.add(c); 
     cars++; 
      System.out.println(Cars.size()); 
    } 
} 

public void paint(Graphics g) { 
    super.paint(g); 
    this.setVisible(true); 
    this.setBackground(Color.BLACK); 
    Road.drawLvl(g); 
    g.setColor(new Color(255,0,0)); 
    //  System.out.println(p1.X); 
    System.out.println(Cars.size()); 
    g.fillRect(p1.X,p1.Y,p1.W,p1.H); 
    for(int i = 0; i<Cars.size(); i++){ 
     System.out.println("s"); 
     Car c = (Car) Cars.get(i); 
     g.setColor(new Color((r.nextInt(2)*255),(r.nextInt(2)*255),(r.nextInt(2)*255))); 
     g.fillRect(c.X,c.Y,c.W,c.H); 
    } 
} 

}

+1

'", но когда я пытаюсь сделать это внутри методы печати() он не признает это. "' - Какой 'print()' метод ?? И не рисуйте прямо внутри JFrame. Вместо этого прочитайте тут на рисунке в Swing. –

+0

Извините, я имел в виду 'paint', исправит – user3800396

+0

@HovercraftFullOfEels Даже если я рисую что-то еще, мне нужно использовать методы Swing' paint() 'или' paintComponent() ', правильно? – user3800396

ответ

-1

Автомобиль добавляется к вагонам при помощи метода Update. Если в paint массив пуст, это связано с тем, что автомобиль не был добавлен в «Автомобили». Итак, просто убедитесь, что метод Update вызывается иначе массив всегда будет пустым - если вы не измените массив напрямую, а не через Update.

+1

-1 «Попробуйте добавить вызов для обновления внутри краски», метод рисования НЕ должен обновлять свое собственное состояние, а только красить его состояние. – camickr

+0

Это сработало, но я немного чувствую, что Icky вызывает Update от боли, есть ли способ позвонить из другого класса и по-прежнему следить за обновлениями? если вы проверите выше, вы увидите, как я в настоящее время обновляю класс в своем Main.java. – user3800396

+0

Не вызывайте Update from paint. Это была просто гипербола, указывающая, что обновление должно быть вызвано. –

1

Давайте начнем с того, что свинг ралли изображение не Потокобезопасная, это означает, что в большинстве случаев любые обновления пользовательского интерфейса должно быть сделано из в контексте события диспетчерские Пропустите

Для этого, как правило, javax.swing.Timer является предпочтительным механизмом для планирования регулярных обратных вызовов, которые нуждаются в изменении состояния пользовательского интерфейса

Кроме того, перерисовки главного окна может быть недостаточно, чтобы вызвать перекомпоновку дочерних компонентов.

В вашем примере с кодом, вы можете позвонить по телефону repaint из вашего метода update. Опасность здесь в том, что вы можете вносить изменения в состояние, пока компонент окрашен, вызывая несоответствия в выходе.

Именно поэтому я бы рекомендовал вместо этого использовать javax.swing.Timer, так как это позволит вам обновить состояние в контексте EDT (которое также отвечает за выполнение обновлений красок), что означает, что его (рядом) невозможно для состояние будет обновлять и окрашено в то же время

Как правило, компоненты Свингов должны переопределить paintComponent для выполнения пользовательских картины

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