Problem z komunikacją między klasami poprzez zdarzenia

0

Witam, piszę prostą gierkę w Javie i niestety zaciąłem się w kluczowym momencie. Mam zbudowane ładne menu i chciałbym przejść nieco dalej, tzn, przejść do kolejnego menu a następnie zacząć rozgrywkę. Niestety, moje menu nie chce reagować na moje prośby :) Tak to w tej chwili wygląda:

SpaceMission.java

//package + importy
public class SpaceMission extends Canvas implements ActionListener {

  public static final int GAMEWIDTH = 800;
  public static final int GAMEHEIGHT = 600;
  public static long usedTime; //do FPS
  private long startTime; //do FPS
  private static final String rsrcsrootpath = "src" + File.separator + "spacemission" + File.separator;
  public static final String imagespath = rsrcsrootpath + "images" + File.separator;
  public static final String soundspath = rsrcsrootpath + "sounds" + File.separator;
  public static final String otherspath = rsrcsrootpath + "others" + File.separator;

  private void InitSpaceMission() {
    //tworzenie okna i ustawienie jego właściwości

    //utworzenie widoku poczatkowego - menu startowego
    String[] startMenuButtonsNames = {"newgame", "options", "exit"};
    Menu startMenu = new Menu(startMenuButtonsNames);
    startMenu.addActionListener(this);

    //wyswietlenie menu i okna
  }
  public void actionPerformed(ActionEvent e) {
    System.out.println("Zmieniam opcje gry");
  }

  public static void main(String[] args) {
    final SpaceMission NewGame = new SpaceMission();
    SwingUtilities.invokeLater(new Runnable() {

      public void run() {
        NewGame.InitSpaceMission();
      }
    });
    usedTime = 1000;
    while (true) {
      NewGame.repaint();
    }
  }
}

Menu.java

//package + importy

public class Menu extends JPanel implements ActionListener {

  protected ActionListener actionListener = null;
  private Sprites sprites = new Sprites();
  private SoundSprites soundsprites = new SoundSprites();
  private String buttonspath = SpaceMission.imagespath + "buttons" + File.separator;
  private Font DefaultGameFont;
  private AudioStream ButtonSound;

  public Menu(String[] buttonNamesArray) {
    //konstruowanie pojedyńczego menu
    //m.in
    IButton[] buttonsArray = new IButton[buttonNamesArray.length];
    for (int i=0; i<buttonNamesArray.length; ++i) {
      buttonsArray[i] = new IButton(imagesArray[i][0], imagesArray[i][1], buttonNamesArray[i]);
      buttonsArray[i].addActionListener(this);
    } //gdzie IButton to obiekt dziedziczący po JButton, ustawiający na wstępie parę opcji dot. wyglądu
  }
  //wyswietlenie przycisków

  public void paintComponent(Graphics g) {
    //rysowanie logo i innych obrazków
  }

  //poniżej obsluga przycisków menu
  public void actionPerformed(ActionEvent e) {
    //odtwórz dźwięk
    if (e.getActionCommand().equals("newgame")) {
      System.out.println("Zacznij rozgrywkę");
    }
    if (e.getActionCommand().equals("next")) {
      System.out.println("Idz dalej");
    }
    if (e.getActionCommand().equals("options")) {
      System.out.println("Zmień opcje gry");
      ActionEvent ev = new ActionEvent(e.paramString(), 0, "OptionsMenu");
    }
    if (e.getActionCommand().equals("exit")) {
      System.exit(0);
    }
  }
  protected void addActionListener(ActionListener l) {
    actionListener = AWTEventMulticaster.add(actionListener, l);
  }

  protected void removeActionListener(ActionListener l) {
    actionListener = AWTEventMulticaster.remove(actionListener, l);
  }
}

Nasłuchiwanie zdarzeń wewnątrz klasy działa doskonale. Ładnie wyświetla mi w terminalu "Zmień opcje gry", następnie powinno wysłać zdarzenie do klasy głównej, która w odpowiedzi na to powinna wyświetlić "Zmieniam opcje gry". Ale to jednak nie następuje. Może to być wina tej dziwnej implementacji addActionListener jaką znalazłem gdzieś w odmętach internetu? Pomocy, bo termin goni niemiłosiernie. :(

0

Ok, pogrzebałem w tych odmętach jeszcze trochę i okazało się, że ActionEventy przekazuje się mniej więcej tak:

if (actionListener != null) {
  actionListener.actionPerformed(new ActionEvent(e.paramString(), 0, "OptionsMenu"));
}

Temat w sumie do skasowania, no chyba, że się to komuś przyda.

1 użytkowników online, w tym zalogowanych: 0, gości: 1