Komischer zusammenhang zwischen LinkedList und QScrollArea?!

Alles zum Qt Framework für Java
Antworten
Tobi1988
Beiträge: 28
Registriert: 13. Juni 2008 09:14

Komischer zusammenhang zwischen LinkedList und QScrollArea?!

Beitrag von Tobi1988 »

Hi zusammen,

hier erstmal der wichtigste Codeabschnitt:

Code: Alles auswählen

private void alteFelder() {
			group = new QGroupBox();
			grid = new QGridLayout();
			
			if (check.isChecked()==true) {
				System.out.println("ischecked = true");
				for (int i = 0; i < datumListe.size(); i++) {;
					datum = new QLineEdit();
					fach = new QComboBox();
					aufgabe = new QTextEdit();
					aufgabe.setFixedSize(new QSize(160, 80));
					fach.addItems(faecher);
					datum.setText("bla");
					datum.setText(datumListe.get(i).text());
					fach.setCurrentIndex(fachListe.get(i).currentIndex());
					aufgabe.setText(aufgabeListe.get(i).toPlainText());
					grid.addWidget(datum, i, 0);
					grid.addWidget(fach, i, 1);
					grid.addWidget(aufgabe, i, 2);

				}
			} else {
				for (int i = 0; i < datumListe.size(); i++) {
					
					String[] datumArray = datumListe.get(i).text().split("\\.");
					
					if ((Integer.parseInt(datumArray[2]) >= (datumAktuell
							.getYear() + 1900)
							&& Integer.parseInt(datumArray[1]) >= (datumAktuell
									.getMonth() + 1) && Integer
							.parseInt(datumArray[0]) >= datumAktuell.getDate())
							|| (Integer.parseInt(datumArray[2]) >= (datumAktuell
									.getYear() + 1900) && Integer
									.parseInt(datumArray[1]) > (datumAktuell
									.getMonth() + 1))
							|| Integer.parseInt(datumArray[2]) > (datumAktuell
									.getYear() + 1900)) {
						datum = new QLineEdit();
						fach = new QComboBox();
						aufgabe = new QTextEdit();
						aufgabe.setFixedSize(new QSize(160, 80));
						fach.addItems(faecher);
						datum.setText(datumListe.get(i).text());
						fach.setCurrentIndex(fachListe.get(i).currentIndex());
						aufgabe.setText(aufgabeListe.get(i).toPlainText());
						grid.addWidget(datum, i, 0);
						grid.addWidget(fach, i, 1);
						grid.addWidget(aufgabe, i, 2);
					}
				}
				
			}
			group.setLayout(grid);
			scroll.setWidget(group);
			group.setFlat(true);
		}
Jetzt der äußerst merkwürdige Fehler:
Die Methode wird aufgerufen, sobald ich einen Dialog im Hauptprogramm öffne. Außerdem dient sie als Slot. In dem Dialog gibt es eine QCheckBox. Wenn ich dort draufklicke, wird diese Methode auch geöffnet. Das Problem liegt jetzt an folgender Stelle: Wenn die Methode beim Dialogöffnen ausgeführt wird, läuft sie einwandfrei. Klicke ich jedoch die CheckBox an, so kann ich die Elemte aus den 3 LinkedList (datumListe,fachListe und aufgabeListe) nicht mehr lesen (habe durch system.out.prinln versucht auszugeben). Die Anzahl kann ich jedoch mit datumListe.size() ausgeben. Das komische ist jetzt, dass ich auf die Elemte wieder zugriff habe, wenn ich die 3. letzte Zeile (scroll.setWidget(group)) auskommentiere bzw. lösche. Der Fehler verwirrt mich total. Bitte helft mir :-)

MfG
Tobi
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Code: Alles auswählen

               datum = new QLineEdit();
               fach = new QComboBox();
               aufgabe = new QTextEdit(); 
Du solltest zunächst immer ein parent angeben (z.B. Deinen Dialog). Der Rest ist mir nicht ganz verständlich.

Deine Liste enthält 3 Element, aber wenn auf die Inhalte der Liste zugreifen willst, sind sie nicht da ? Was passiert dann ? NullPointerException ??

Gruß Arne
Tobi1988
Beiträge: 28
Registriert: 13. Juni 2008 09:14

Beitrag von Tobi1988 »

Hi,

also im Prinzip ist es ganz einfach, wenn die CheckBox aktiviert ist, sollen alle Daten aus den 3 Listen genommen werden. Ansonsten sollen nur die ausgegeben werden, die kein Datum aus der Vergangenheit haben(die lange if-Abfrage fragt eigendlich nur ab, ob das Datum älter als heute ist, und wenn nicht, dann wirds ausgegeben) Deshalb muss ich ja in der QScroll Area immer wieder die Sachen löschen und die ScrollArea wieder mit neuen Sachen füllen, jenachdem was angeklickt ist. Dazu erstelle ich dann die GroupBox und das GridLayout immer wieder neu, wenn die CheckBox geändert wird, damit ich ich die neuen Sachen in das GridLayout schreiben kann. Ich kann halt die alten Sachen nicht einfach aus dem GridLayout entfernen, weil ich diese ja dann auch wieder in einer Liste haben müsste um sie erst da zu löschen. Deshalb erstelle ich das GridLayout und GroupBox einfach neu und sage dann nachher, dass die GroupBox in die ScrollArea soll (das hat bisschen auch immer so geklappt bei mir.. habe es schon desöfteren so gemacht). Jetzt tritt aber wie eben schon gesagt auf einmal das Problem auf, dass er nicht mehr aus der Liste die Elemte lesen kann, ABER die anzahl, wieviel elemete dort drin sind, kann er mir ausgeben. Hier die Fehlermeldung:

Code: Alles auswählen

Exception caught after invoking slot
com.trolltech.qt.QNoNativeResourcesException: Function call on incomplete object of type: com.trolltech.qt.gui.QLineEdit
	at com.trolltech.qt.core.QObject.thread(QObject.java:231)
	at com.trolltech.qt.GeneratorUtilities.threadCheck(GeneratorUtilities.java:38)
	at com.trolltech.qt.gui.QLineEdit.text(QLineEdit.java:651)
	at PlanerDesign$Ha.alteFelder(PlanerDesign.java:524)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.trolltech.qt.internal.QSignalEmitterInternal$AbstractSignalInternal.emit_helper(QSignalEmitterInternal.java:346)
	at com.trolltech.qt.QSignalEmitter$Signal1.emit(QSignalEmitter.java:195)
	at com.trolltech.qt.gui.QDialog.__qt_exec(Native Method)
	at com.trolltech.qt.gui.QDialog.exec(QDialog.java:92)
	at PlanerDesign.widgetHa(PlanerDesign.java:164)
	at PlanerImpl.widgetHa(PlanerImpl.java:91)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.trolltech.qt.internal.QSignalEmitterInternal$AbstractSignalInternal.emit_helper(QSignalEmitterInternal.java:346)
	at com.trolltech.qt.QSignalEmitter$Signal1.emit(QSignalEmitter.java:195)
	at com.trolltech.qt.gui.QApplication.exec(Native Method)
	at PlanerImpl.main(PlanerImpl.java:44)

Die Zeile 524 in meinem Programm ist die Zeile, wo ich aus der LinkedList den String in QLineEdit schreibe :

Code: Alles auswählen

					datum.setText(datumListe.get(i).text());
[/code]
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Ich will den Source jetzt nicht gleich ausprobieren, aber für Elemente wie

QLabel QComboBox usw

solltest Du immer einen Parent angeben. Dann kann Qt die Resourcen wieder ordnungsgemäß freigegen, wenn Du das Fenster schließt. Möglichweise sind die (nativ in C++ gehaltenen) Referenzen auf die GUI-Objekte nicht mehr gültig.

Gruß Arne
Antworten