Это прекрасное время для использования Обозревателя, если вы хотите сообщить «наблюдающим классам», что событие KeyPress произошло в вашем мировом классе.Структура должна выглядеть примерно так:
public interface Observer
{
public void update(KeyEvent keyEvent);
}
public interface Observable
{
public void NotifyObservers(KeyEvent keyEvent);
}
public class World implements KeyListener, Observable
{
private ArrayList<Observer> obsList;
public World()
{
obsList = new ArrayList();
}
public void keyPressed(KeyEvent e)
{
NotifyObservers(e);
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
public void NotifyObservers(KeyEvent keyEvent)
{
for(Observer obs : obsList)
{
obs.update(keyEvent);
}
}
public void AddObserver(Observer obs)
{
if (obs != null)
obsList.add(obs);
}
public void DelObserver(Observer obs)
{
if (obs != null)
obsList.remove(obs);
}
}
public class Blobs extends JFrame implements Observer
{
public Blobs()
{
super("Blobs :) - By Chris Tanaka");
//Register this instance of Blobs as an observer that is stored in the World's
//obsList ArrayList field
World world = new World();
world.addObserver(this);
setResizable(false);
setSize(1000, 1000);
setIgnoreRepaint(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().add(world);
this.addKeyListener(world);
setVisible(true);
}
public static void main(String[] args) {
new Blobs();
}
public void update(KeyEvent keyEvent)
{
//do whatever here when key event occurs
}
}
Так что конечный результат здесь заключается в том, что вы можете сделать любой класс, реализующий интерфейс Observer, частью описанного мной obsList.Затем, когда происходит событие keyevent, он вызывает метод NotifyObservers (), который выполняет итерацию по списку и вызывает метод update () в классе Observing.
РЕДАКТИРОВАТЬ:
Вы можете иметь оба мираи боевые классы обрабатывают ключевые события по-своему, если хотите.
public class Battle implements Observer
{
public void update(KeyEvent e)
{
// do processing here
}
}
public class Blobs implements Observer
{
public void update(KeyEvent e)
{
// do processing here
}
}
В какой-то момент вам просто нужно добавить битву в качестве наблюдателя в ваш класс World, как я это сделал в Blobs
worldInstance.addObserver(new Battle());
Кроме того, если вы хотите использовать флаги, чтобы позволить только определенным классам обрабатывать ключевые события, вы можете просто обновить интерфейс, чтобы разрешить передачу флага методу обновления, следующим образом:
public interface Observer
{
public void update(object isFor, KeyEvent e);
}
тогда у ваших методов обновления Observer будет такой поток:
public class Battle
{
public void update(object flag, KeyEvent e)
{
if (flag instanceof Battle)
{
//now do your work
}
}
}
Это также означает обновление метода notify в интерфейсе Observable и реализации