2014-01-11 8 views
0

Во-первых, я знаю, что способ, которым я пытаюсь прочитать ввод, очень плохо, но я попытался использовать Keylistener, и он не работает независимо от того, что я пытаюсь. Я не знаю, что я делаю неправильно, так что я сейчас пытаюсь это сделать. Я пытаюсь вызвать поток в Controller.java из PreControls.java. Если бы вы могли помочь мне внедрить рабочий ключевой список, мне это очень понравилось бы, но я думаю, что исправление проблемы с этим потоком тоже будет работать. Я попытался отладить его, и поток, похоже, не запускается.Пытается начать свою тему

Код в PreControls.java:

Controller C = new Controller(); 
C.start(); 
System.out.print("Thread Should be started "); 

Код в Controller.java:

package Game; 

public class Controller extends Thread { 
    public void MyShipController(){ 
     System.out.print("Thread Is started "); 
     String CharIn = ""; 
     while(SpaceInvaders.GameOn = true){ 
      CharIn = PreControls.ReadKeyPressed.getText(); 
      if(CharIn.equalsIgnoreCase("a")){ 
       SpaceInvaders.MyPos[0]--; 
       System.out.print("Move Left "); 
      }else if(CharIn.equalsIgnoreCase("d")){ 
       SpaceInvaders.MyPos[0]++; 
       System.out.print("Move Right"); 
      }else if(CharIn.equalsIgnoreCase(" ")){ 
       //Fire Bullet 
      } 
     PreControls.ReadKeyPressed.setText(""); 
     SpaceInvaders.MyShip.setLocation(SpaceInvaders.MyPos[0], SpaceInvaders.MyPos[1]); 
     jp1.repaint(); 
     } 
    } 
} 

Извините за не предоставление SSCCEE. Мне нужно отправить весь проект, и это победит в том, что он делает проект.

ReadKeyPressed - это JTextArea, в который я вставляю буквы. jp1 является JFrame

Я работаю в среде Eclipse IDE.

EDIT: забыли добавить: после запуска апплета консоль читает только «Thread Should be started», поэтому это проблема с тем, как я создал поток, или как я пытаюсь его создать.

Редактировать 2: Цель «Мой конец» - обнаружить, когда нажата стрелка (или стрелка влево), и перемещать MyShip (JLabel) влево на 1 позицию, а вправо - на 1 позицию, если d (или стрелка вправо).

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

+2

Вы не преодолели метод 'run()'.Вы добавили несвязанный метод 'MyShipController()'. –

+1

Нет, вы не совсем поняли концепцию [sscce] (http://sscce.org) или сейчас здесь для этого сайта [MCVE] (http://stackoverflow.com/help/mcve). Мы не хотим видеть весь ваш код или фрагменты кода. Вместо этого мы хотим, чтобы ** совершенно новая программа ** была небольшой, которая извлекает вашу проблему, которая выполняется, и это демонстрирует вашу проблему. Перечитайте ссылку. –

+3

Попробуйте расширить Runnable, а не поток и реализовать метод single run(). – csmckelvey

ответ

1

Код, который вы написали в методе MyShipController, должен быть помещен в метод вашей нити run. Метод run - это то, что поток фактически выполняет внутри.

Как вы сейчас написали, начало вызова в вашем классе Controller запустит ваш поток, и этот поток завершится немедленно, так как его метод run пуст.

public class Controller extends Thread { 

@Override 
public void run() 
//public void MyShipController(){ 
    System.out.print("Thread Is started "); 
    String CharIn = ""; 
    while(SpaceInvaders.GameOn = true){ 
     CharIn = PreControls.ReadKeyPressed.getText(); 
     if(CharIn.equalsIgnoreCase("a")){ 
      SpaceInvaders.MyPos[0]--; 
       System.out.print("Move Left "); 
      }else if(CharIn.equalsIgnoreCase("d")){ 
       SpaceInvaders.MyPos[0]++; 
       System.out.print("Move Right"); 
      }else if(CharIn.equalsIgnoreCase(" ")){ 
       //Fire Bullet 
      } 
    PreControls.ReadKeyPressed.setText(""); 
    SpaceInvaders.MyShip.setLocation(SpaceInvaders.MyPos[0], SpaceInvaders.MyPos[1]); 
    jp1.repaint(); 
    } 
    } 
} 

Однако, я полагаю, ваш класс контроллера продлить Runnable вместо Thread.

+1

Вызов команд Swing (за исключением перерисовки) из фонового потока == опасный код. –

+0

Хорошо, что проблема с потоком не началась, но я столкнулся с другой проблемой. Когда я вхожу в «a» в JTextArea, я получаю сообщение о том, что «у вашего компьютера закончилась нехватка памяти». Затем мой компьютер отстает, и Eclipse закрывается. Программа также зависает. Добавляем Thread.sleep (500); или что-то исправить это? –

+0

Это потому, что ваш поток неуклонно объединяет текстовое поле. GUI - это среда, управляемая событиями, то есть вы атакуете какого-то слушателя или обращаетесь к интересующему компоненту, и он сообщает вам, когда что-то происходит. Это известно как шаблон наблюдателя ... – MadProgrammer

3

Этот = является оператором ассирийства.

while(SpaceInvaders.GameOn = true) 

Я думаю, что ты хотел, чтобы этот ==

while(SpaceInvaders.GameOn == true) 

Или еще лучше, и гораздо чище, просто

while(SpaceInvaders.GameOn) 

Кроме того, вы должны использовать сочетания клавиш вместо KeyListener, которые я даю вам проблемы с фокусом. См. this answer для примера использования привязок клавиш. Также см. the tutorial

+0

Не заметил этого, спасибо. Но поток все еще не начинается. И консоль не выводит «Thread Is Start», которая не зависит от оператора while. Но спасибо, что поймали ошибку в заявлении while. –

+0

@ShivamAmin первый комментарий в вашем вопросе отвечает на ваш вопрос. Мой ответ дает более подробную информацию о **, почему это так. Пожалуйста, прочитайте оба. Этот ответ исправляет логическую ошибку в 'MyShipController', но код внутри' MyShipController' по-прежнему не выполняется. –

+0

@WilliamMorrison Я прочитал ваш ответ и добавил комментарий –

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