[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.platform.swt] Why do I get a null pointer exception when trying to dispose a composite within a thread in my program?

Hi,
I try to dispose a composite but get a null pointer exception. I don't understand why it happens. It would be nice if someone can help me a little bit. The lines are 71 and 75.


Here's the programs, it's a simple tic tac to, so have fun with playing ;)

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;


public class swttictacto { public int[] spielfeld = new int[34]; public boolean aktuellerspieler = true; public guithread referenz;

 public static void main (String[] args) {
  swttictacto spiellogik = new swttictacto();
 }

 public swttictacto () {
  for (int p = 0; p < spielfeld.length; p++) {
    spielfeld[p]=0;
  }
  referenz = new guithread(this);
  referenz.start();
 }

public boolean gewonnen() {
boolean ok = false;
if ((spielfeld[11]==1 && spielfeld[12]==1 && spielfeld[13]==1) || (spielfeld[21]==1 && spielfeld[22]==1 && spielfeld[23]==1) || (spielfeld[31]==1 && spielfeld[32]==1 && spielfeld[33]==1) || (spielfeld[11]==1 && spielfeld[22]==1 && spielfeld[33]==1) || (spielfeld[31]==1 && spielfeld[22]==1 && spielfeld[13]==1) || (spielfeld[11]==1 && spielfeld[21]==1 && spielfeld[31]==1) || (spielfeld[31]==1 && spielfeld[32]==1 && spielfeld[33]==1)) { ok = true; referenz.gewonnen(1); }
if ((spielfeld[11]==2 && spielfeld[12]==2 && spielfeld[13]==2) || (spielfeld[21]==2 && spielfeld[22]==2 && spielfeld[23]==2) || (spielfeld[31]==2 && spielfeld[32]==2 && spielfeld[33]==2) || (spielfeld[11]==2 && spielfeld[22]==2 && spielfeld[33]==2) || (spielfeld[31]==2 && spielfeld[22]==2 && spielfeld[13]==2) || (spielfeld[11]==2 && spielfeld[21]==2 && spielfeld[31]==2) || (spielfeld[31]==2 && spielfeld[32]==2 && spielfeld[33]==2)) { ok = true; referenz.gewonnen(2); }
if (!ok && (spielfeld[11]==1 || spielfeld[11]==2) && (spielfeld[12]==1 || spielfeld[12] == 2) && (spielfeld[13]==1 || spielfeld[13]==2) && (spielfeld[21]==1 || spielfeld[21]==2) && (spielfeld[22]==1 || spielfeld[22]==2) && (spielfeld[23]==1 || spielfeld[23]==2) && (spielfeld[31]==1 || spielfeld[31]==2) && (spielfeld[32]==1 || spielfeld[32]==2) && (spielfeld[33]==1 || spielfeld[33]==2)) { referenz.gleichstand(); ok = true; }
return ok;
}


 public void clicked(int buttonnumber) {
  if (aktuellerspieler && spielfeld[buttonnumber]==0) {
    spielfeld[buttonnumber] = 1;
    referenz.klick(buttonnumber,spielfeld[buttonnumber]);
    if (!gewonnen()) {
      aktuellerspieler = !aktuellerspieler;
      referenz.showPlayerMsg(aktuellerspieler);
    }
  }

  if (!aktuellerspieler && spielfeld[buttonnumber]==0) {
    spielfeld[buttonnumber] = 2;
    referenz.klick(buttonnumber,spielfeld[buttonnumber]);
    if (!gewonnen()) {
      aktuellerspieler = !aktuellerspieler;
      referenz.showPlayerMsg(aktuellerspieler);
    }
  }
 }
}

class guithread extends Thread {
  public swttictacto referenz;
  public Label information;
  public Composite oben;
  public Composite unten;
  Button b11,b12,b13,b21,b22,b23,b31,b32,b33;


public guithread(swttictacto ref) { referenz = ref; }

  public void showPlayerMsg(boolean player) {
   if (player) information.setText("Spieler 1 ist dran.");
   if (!player) information.setText("Spieler 2 ist dran.");
  }

  public void gewonnen(int a) {
   information.setText("Spieler "+a+" hat gewonnen");
   this.unten.dispose();
  }
  public void gleichstand() {
   information.setText("Gleichstand");
   this.unten.dispose();
  }

  public void klick(int buttonzahl,int inhalt) {
    if (buttonzahl==11) { b11.setText(""+inhalt); }
    if (buttonzahl==12) { b12.setText(""+inhalt); }
    if (buttonzahl==13) { b13.setText(""+inhalt); }
    if (buttonzahl==21) { b21.setText(""+inhalt); }
    if (buttonzahl==22) { b22.setText(""+inhalt); }
    if (buttonzahl==23) { b23.setText(""+inhalt); }
    if (buttonzahl==31) { b31.setText(""+inhalt); }
    if (buttonzahl==32) { b32.setText(""+inhalt); }
    if (buttonzahl==33) { b33.setText(""+inhalt); }
  }

  public void run() {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setText("Titel in der Titelleiste");
    shell.setSize(200,200);


GridLayout layoutshell = new GridLayout(); layoutshell.numColumns = 1; shell.setLayout(layoutshell);

    oben = new Composite(shell,SWT.NO_BACKGROUND);
    Composite unten = new Composite(shell,SWT.NO_BACKGROUND);

    GridLayout layoutoben = new GridLayout();
    layoutoben.numColumns = 1;
    oben.setLayout(layoutoben);

    GridLayout layout = new GridLayout();
    layout.numColumns = 3;
    unten.setLayout(layout);

    information = new Label(oben,SWT.LEFT);
    information.setText("Spieler 1 ist dran.");

b11 = new Button(unten,SWT.PUSH | SWT.CENTER);b12 = new Button(unten,SWT.PUSH | SWT.CENTER);b13 = new Button(unten,SWT.PUSH | SWT.CENTER);
b21 = new Button(unten,SWT.PUSH | SWT.CENTER);b22 = new Button(unten,SWT.PUSH | SWT.CENTER);b23 = new Button(unten,SWT.PUSH | SWT.CENTER);
b31 = new Button(unten,SWT.PUSH | SWT.CENTER);b32 = new Button(unten,SWT.PUSH | SWT.CENTER);b33 = new Button(unten,SWT.PUSH | SWT.CENTER);


    b11.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event e) {
        switch (e.type) {
        case SWT.Selection:
          referenz.clicked(11);
          break;
        }
      }
    });
    b12.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event e) {
        switch (e.type) {
        case SWT.Selection:
          referenz.clicked(12);
          break;
        }
      }
    });
    b13.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event e) {
        switch (e.type) {
        case SWT.Selection:
          referenz.clicked(13);
          break;
        }
      }
    });
    b21.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event e) {
        switch (e.type) {
        case SWT.Selection:
          referenz.clicked(21);
          break;
        }
      }
    });
    b22.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event e) {
        switch (e.type) {
        case SWT.Selection:
          referenz.clicked(22);
          break;
        }
      }
    });
    b23.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event e) {
        switch (e.type) {
        case SWT.Selection:
          referenz.clicked(23);
          break;
        }
      }
    });
    b31.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event e) {
        switch (e.type) {
        case SWT.Selection:
          referenz.clicked(31);
          break;
        }
      }
    });
    b32.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event e) {
        switch (e.type) {
        case SWT.Selection:
          referenz.clicked(32);
          break;
        }
      }
    });
    b33.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event e) {
        switch (e.type) {
        case SWT.Selection:
          referenz.clicked(33);
          break;
        }
      }
    });

    shell.open();
    while(!shell.isDisposed()) {
       if (!display.readAndDispatch()) {
          display.sleep();
       }
    }
    display.dispose();
  }
}