SWT NullPointerException bei Zugriff auf Variablen des Hauptfensters

  • Themenstarter Themenstarter Hotzenplotz
  • Beginndatum Beginndatum
H

Hotzenplotz

Gast
Hallo!

Ich weiß das Thema wurde hier schon oft besprochen aber ich glaube meins weicht einen ticken von den ganzen in einer Sache ab:

Ich erzeuge in meiner Haupt-GUI-Klasse ein neues Fenster das ich in der uploadDialog-Klasse beschrieben habe über:
Java:
uploadDialog ud = new uploadDialog(shlTest, SWT.NONE);
ud.open();

in dieser uploadDialog-Klasse habe ich zum Beispiel auch ein Textfeld drin und sozusagen eine Setter-Methode für dieses Textfeld die folgendermaßen aussieht:

Java:
public static void setTxt_UpTime(final String s) {
	Display.getDefault().asyncExec( new Runnable() {
		@Override
		public void run() {
			if ( s != null ) {
				txt_UpTime.setText(s);
			}
		}	
	});	
}

Diese Methode kann ich auch ohne Probleme aus einem Thread welcher im uploadDialog gestartet wird aufrufen und der Text wird je nach übergebenem String geändert.

In der display-Klasse (meinem Hauptfenster) habe ich das ganze mit einer setter-Methode für ein Textfeld in dieser analog gemacht.
Allerdings bekomme ich wenn ich aus dem Thread ODER aber dem uploadDialog die setter Methode aus der display-Klasse aufrufe die NullPointerException.

Ich bin noch relativ neu in JAVA und SWT aber ich habe das Gefühl, dass durch den geöffneten uploadDialog mein Hauptfenster blockiert wird, weshalb ich versucht habe den uploadDialog als eigenen Thread zu starten. Aber dann erscheint nach Klick auf den entsprechenden Button
mein uploadDialog erst gar nicht.
Eine weitere Möglichkeit wäre ja das zu ändernde Textfeld erst der uploadDialog-klasse zu übergeben und darauf dann dem Thread der was dort reinschreiben soll.

Allerdings würde ich es schicker finden wenn ich das ganze doch irgendwie über die Setter Methode hinkriegen kann...

Ich hoffe ihr könnt mir ohne weiteren Code weiterhelfen, ansonsten kann ich natürlich gerne noch etwas nachhelfen.

Gruß und danke schonmal für eure Hilfe
Hotzenplotz
 
Wie übergibst du denn die Instanz?
Irgendwie müssen die "Unterklassen" ja wissen, mit wem diese kommunizieren sollen.

Java:
public class meineGui {
	public meineGui() {
		new Unterklasse(this); // MIT instanz
	}

	public void setterMethode(String text) {
		System.out.println("Bekomme: " + text);
	}
}

public class Unterklasse {
	protected meineGui instanz = null;

	public Unterklasse(meineGui test) {
		this.instanz = test; // Übergebene Instanz setzen

		this.instanz.setterMethode("LOOOL"); // Ansprechen der Methode aus der Hauptklasse
	}
}
 
Hallo!
Ich habe gerade nochmal probiert ein simples Beispiel zu code mit dem ich verdeutlichen kann was genau mein Problem ist und dort tritt der Fehler komischerweise nicht auf! Komisch
Ich suche jetzt nochmal was und melde mich dann später nochmal.
 
Ok ich habe jetzt mal weiter nachgeforscht.....

Und zwar tritt der Fehler bzw die NullPointerException nur auf wenn ich versuche über eine Setter Methode den Text eines "StyledText"-Objektes zu ändern.
Wenn der styledText allerdings direkt in der Main-Methode des Fenster beim Klick des Buttons, also beim actionevent geändert wird, dann klappt es komischerweise. So komme ich aber nicht von der anderen Klasse an den styledText ran...

Hier mal meine Beispielklassen falls das jemand ausprobieren möchte :-/

mainWindow:
[Java]
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.widgets.Button;


public class mainWindow {
private static Text txtMWTxt;
private static StyledText styledText;

/**
* Launch the application.
* @param args
*/
public static void main(String[] args) {
Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(450, 300);
shell.setText("SWT Application");
shell.setLayout(new GridLayout(1, false));

Menu menu = new Menu(shell, SWT.BAR);
shell.setMenuBar(menu);

MenuItem mntmFile = new MenuItem(menu, SWT.CASCADE);
mntmFile.setText("File");

Menu menu_1 = new Menu(mntmFile);
mntmFile.setMenu(menu_1);

MenuItem mntmTestdialog = new MenuItem(menu_1, SWT.NONE);
mntmTestdialog.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
testDialog tD = new testDialog(shell, SWT.NONE);
tD.open();
}
});
mntmTestdialog.setText("testDialog");

final StyledText styledText = new StyledText(shell, SWT.BORDER);
styledText.setText("styledText");
styledText.setEditable(false);
styledText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
new Label(shell, SWT.NONE);

Button btnStyledtext = new Button(shell, SWT.NONE);
btnStyledtext.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
styledText.append( " Kein Absturz!" );
}
});
btnStyledtext.setText("styledText ohne Setter");

Button btnStyledtextMitSetter = new Button(shell, SWT.NONE);
btnStyledtextMitSetter.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setStyledText( "Absturz!" );
}
});
btnStyledtextMitSetter.setText("styledText mit Setter");
new Label(shell, SWT.NONE);
new Label(shell, SWT.NONE);
new Label(shell, SWT.NONE);

txtMWTxt = new Text(shell, SWT.BORDER);
txtMWTxt.setText("Text\u00E4nderung hier gibt NullPointerException");
txtMWTxt.setEditable(false);
txtMWTxt.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

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

public static void setTxtMWTxt(final String s) {
Display.getDefault().asyncExec( new Runnable() {
@Override
public void run() {
txtMWTxt.setText( s );
}
});
}

public static void setStyledText(final String s) {
Display.getDefault().asyncExec( new Runnable() {
@Override
public void run() {
styledText.append( s + "\n");
}
});
}

}
[/Java]


testDialog:
[Java]
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.custom.StyledText;


public class testDialog extends Dialog {

protected Object result;
protected Shell shell;
private static Text txtDTxt;
private static StyledText styledText;

/**
* Create the dialog.
* @param parent
* @param style
*/
public testDialog(Shell parent, int style) {
super(parent, style);
setText("SWT Dialog");
}

/**
* Open the dialog.
* @return the result
*/
public Object open() {
createContents();
shell.open();
shell.layout();
Display display = getParent().getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
return result;
}

/**
* Create contents of the dialog.
*/
private void createContents() {
shell = new Shell(getParent(), getStyle());
shell.setSize(450, 300);
shell.setText(getText());
shell.setLayout(new GridLayout(2, false));
new Label(shell, SWT.NONE);
new Label(shell, SWT.NONE);
new Label(shell, SWT.NONE);

Button btnTextHier = new Button(shell, SWT.NONE);
btnTextHier.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setTxtDTxt( "Kein Absturz vom Dialog aus!" );
}
});
btnTextHier.setText("Text hier");
new Label(shell, SWT.NONE);

Button btnStyledtextHier = new Button(shell, SWT.NONE);
btnStyledtextHier.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
styledText.append( " Kein Absturz!");
//setStyledTxtDTxt( "Absturz!" );
}
});
btnStyledtextHier.setText("StyledText Hier");
new Label(shell, SWT.NONE);

txtDTxt = new Text(shell, SWT.BORDER);
txtDTxt.setEditable(false);
txtDTxt.setText("Text");
txtDTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
new Label(shell, SWT.NONE);

StyledText styledText = new StyledText(shell, SWT.BORDER);
styledText.setEditable(false);
styledText.setText("StyledText");
styledText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
new Label(shell, SWT.NONE);

Button btnTextHauptfenster = new Button(shell, SWT.NONE);
btnTextHauptfenster.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
mainWindow.setTxtMWTxt( "Kein Absturz vom Dialog aus!" );
}
});
btnTextHauptfenster.setText("Text Hauptfenster");
new Label(shell, SWT.NONE);

Button btnStyledtextHauptfenster = new Button(shell, SWT.NONE);
btnStyledtextHauptfenster.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
mainWindow.setStyledText( "Absturz!" );
}
});
btnStyledtextHauptfenster.setText("StyledText Hauptfenster");
new Label(shell, SWT.NONE);

Button btnThread = new Button(shell, SWT.NONE);
btnThread.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
startThread().start();
}
});
btnThread.setText("Thread starten");

}


private static Thread startThread() {
return new Thread() {
public void run() {
testThread.tuWas();
}
};
}


public static void setStyledTxtDTxt(final String s) {
Display.getDefault().syncExec( new Runnable() {
@Override
public void run() {
styledText.append( s );
}
});
}


public static void setTxtDTxt(final String s) {
Display.getDefault().asyncExec( new Runnable() {
@Override
public void run() {
txtDTxt.setText( s );
}
});
}

}
[/Java]

testThread:
[Java]

public class testThread {
public testThread()
{
super();
}

public static void tuWas() {

testDialog.setTxtDTxt( "Kein Absturz vom Thread aus beim Text im testDialog!" );

mainWindow.setTxtMWTxt( "Kein Absturz vom Thread aus beim Text im mainWindow!" );

mainWindow.setStyledText( "Absturz vom Thread aus!" );
}

}
[/code]
 
Ok ich habe den (doofen) Fehler gefunden...

Statt Zeile 50 in der mainWindow-Klasse
Java:
final StyledText styledText = new StyledText(shell, SWT.BORDER);

muss dort ohne das "final StyledText" stehen

Java:
styledText = new StyledText(shell, SWT.BORDER);
🙂


Der Thread kann also als erledigt markiert werden.
 
Bitte, bitte, bitte... Beachte die üblichen Naming Conventions.

In deinem Fall:
Klassennamen beginnen mit einem Großbuchstaben!
 

Zurück
Oben