NullPointerException

Wyatt

Erfahrenes Mitglied
JFace - NullPointerException

Hola!

ich arbeite mich gerade in JFace ein und sitze nun vor einem Problem...
Fehler ist soweit gefunden, nur ihn zu beheben ist das Problem ;)
Ein ComboViewer mit ContentProvider, LabelProvider und Input ... soweit alles gut!

jetzt möchte ich per Menü daten löschen, dafür übergebe ich die comboViewer.getInput() ...
und da krachts dann auch schon - NullPointerException!

Code:
protected MenuManager createMenuManager() {
		MenuManager menuBar = new MenuManager(null);
		MenuManager menu = new MenuManager("Neu");
		
		menu.add(new jfaceReadWriteConfigNewAction(this, (ArrayList) comboViewer.getInput()));
		menu.add(new jfaceReadWriteConfigRemAction(this, (ArrayList) comboViewer.getInput(), selection)); 
	        menuBar.add(menu);    		
	        return menuBar;
	}

ich hab bisher schon rausgefunden, dass createMenuManager vor createContents aufgerufen wird, daher kommt wohl auch die NullPointerException!
comboViewer wird innerhalb von createContents aufgerufen.

Vielleicht habt Ihr ja eine Idee...
Gruß
Felix
 
Zuletzt bearbeitet:
Hi,

wenn ich das richtig verstehe, dann gibst Du ja selbst die Lösung.

--> dass createMenuManager vor createContents aufgerufen wird
da Du in der Methode createMenuManager()
folgendes aufrufst:
Code:
menu.add(new jfaceReadWriteConfigNewAction(this, (ArrayList) comboViewer.getInput()));

Ist mit ziemlicher Wahrscheinlichkeit dein ContentProvider null.

Setz mal einen Breakpoint und debug das mal.

Ciao und Gruss,
Tom
 
almost ... hehe
mein comboViewer ist unter anderem null, hab gerad mal debugged :)

ist es denn möglich den comboViewer vor dem Menu zu initialisieren!? das wäre ja quasi die Lösung des Problems :)

Gruß
Felix
 
soweit waren wir ja nun schon...
die Frage ist nun, wie kann ich die Contents vor dem Menü initialisieren?

Aufrufe createContents() im Constructor funktionieren nicht, weil die parentShell immer noch null ist, wie nahezu alles in der GUI...
Google mag auch nichts nützliches ausspucken.

Gruß
Felix
 
Hola nochmals...

bisher habe ich es nicht geschafft, die Contents vor dem Menü zu initialisieren...
der Aufbau sieht grob so aus:
Java:
public class View extends ApplicationWindow {

	private ComboViewer comboViewer = null;

	public JFaceTreeViewerExample() {
		super();
		super.addMenuBar();
		super.addStatusLine();
	}
	
	protected void configureShell(Shell shell){
		super.configureShell(shell);
		shell.setSize(250,250);
		shell.setText("View");
		shell.setLayout(new FillLayout());
	}

	protected Control createContents(Composite parent) {
		createComboViewer(parent);
		return super.createContents(parent);
	}
	
	private void createComboViewer(Composite parent){
		comboViewer = new ComboViewer(parent);
		comboViewer.setContentProvider(new ContentProvider());
		comboViewer.setLabelProvider(new LabelProvider());
		comboViewer.setInput(new InputProvider());
	}
	
	protected MenuManager createMenuManager(){
		MenuManager menuBar = new MenuManager("");
		MenuManager fileMenu = new MenuManager("&Neu");
		menuBar.add(fileMenu);
		// hier krachts - comboViewer ist null
		fileMenu.add(new neuAction(this, (ArrayList) comboViewer.getInput());
		return menuBar;
	}

	protected StatusLineManager createStatusLineManager(){
		return new StatusLineManager();
	}

}

Stimmt leider nicht zu 100%, weil ich gerad nicht daheim bin und hier kein Eclipse bzw. das Projekt habe... deshalb ist es nur der grobe Aufbau :)

Problem ist nun, dass ich eine nullpointerexception bekomme, weil der comboViewer noch null ist ...
Wie ist nun möglich die Contents vor dem Menü zu initialisieren oder das Menü später zu initialisieren?!
Bisher habe ich versucht, die Methode später oder woanders aufzurufen, das hat jedoch nicht funktioniert.

Ich hoffe, jemand kann mir helfen!
Danke & Gruß
Felix
 
Hi Felix,

ich habe mit dem Menu noch nichts gemacht, aber hier steht ja
Code:
    public JFaceTreeViewerExample() {        
      super();        
      super.addMenuBar();        
      super.addStatusLine();    
  }
Demnach wird im Konstruktor der Konstruktor der Superclass aufgerufen, also der von ApplicationWindow, und danach ApplicationWindow.setMenuBar().
Evtl. solltest Du mal einen Breakpoint dort setzen, denn da sollte die MenuBar instanziiert werden.

Alternativ kannst Du die Zeilen
Code:
      super.addMenuBar();        
      super.addStatusLine();

auch nachdem Du Deinen ComboViewer erstellst, aufrufen.

Ciao und Gruss,
Tom
 
Hi Tom,

wie ich schon sagte, habe ich das schon ausprobiert...
eine eigene Methode für den Aufruf der addMenuBar Metthode hat auch nichts gebracht, die Methode scheint nur "Wirkung" im Constructor und in der configureShell zu haben.
Java:
protected Control createContents(Composite parent) {
        createComboViewer(parent);
        
        super.addMenuBar();

        return super.createContents(parent);
}

Java:
private void createComboViewer(Composite parent){
        comboViewer = new ComboViewer(parent);
        comboViewer.setContentProvider(new ContentProvider());
        comboViewer.setLabelProvider(new LabelProvider());
        comboViewer.setInput(new InputProvider());
        
        super.addMenuBar();
}

Gruß
Felix
 
Zuletzt bearbeitet:
Hi,

erstmal einen interessanten Artikel:
http://www.ibm.com/developerworks/library/os-ecgui3/

Und dann einen Vorschlag.
Hast Du schonmal das Folgende getestet?
Code:
	private void createComboViewer(Composite parent) {
		comboViewer = new ComboViewer(parent);
		comboViewer.setContentProvider(new ContentProvider());
		comboViewer.setLabelProvider(new LabelProvider());
		comboViewer.setInput(new InputProvider());
	}

	protected MenuManager createMenuManager(Compisite parent) {
                                //unschön, aber mal zum Testen den Comboviewer hier erzeugen
                                //damit ist er nie null!
                                createComboViewer(parent);

		MenuManager menuBar = new MenuManager("");
		MenuManager fileMenu = new MenuManager("&Neu");
		menuBar.add(fileMenu); 
                                // hier krachts - comboViewer ist null
	                fileMenu.add(new neuAction(this, (ArrayList)
	                comboViewer.getInput()); return menuBar; }
	}

Viel Erfolg,
Tom
 
Aloha Tom,

ja, habe ich auch schon getestet, dadurch, dass wir ein Argument hinzugeben, rufen wir nicht mehr die eigentliche createMenuManager Methode auf, sondern haben nun unserer eigene!

Den Artikel kenn ich, sind schöne Erklärungen bei :)

Gruß
Felix
 
Zurück