PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] JComponent in Array läßt sich nicht referenzieren


minos5000
2008-01-11, 15:37:11
Hi,

ich habe eine von JPanel abgeleitete Klasse namens DrawingPanel, von der mehrere Instanzen auf Tabs in einem TabbedPane verteilt werden sollen. Zusätzlich ist jede der Distanzen in einem ScrollPane eingebettet.

Dazu wollte ich die nötige Zahl von DrawingPanes und ScrollPanes jeweils in einem Array speichern.

Das Problem das ich jetzt habe ist, daß Referenzen auf die DrawingPanes immer eine NllPointerException werfen die ich mir nicht erklären kann.

Der entsprechende Code sieht so aus:


public Gui() {
initComponents();

dbCon = new DBConnector();
objects = new LinkedList<Objects>();
objects = dbCon.getAllObjects();
this.setLocation(10, 10);
this.setSize(800, 600);

floors = dbCon.getFloorsNumber();
drawingPane = new DrawingPane[floors.size()];
scroller = new JScrollPane[floors.size()];
windows = new JTabbedPane(JTabbedPane.TOP);


for(int i = 0; i < floors.size(); i++) {
drawingPane[i] = new DrawingPane();
scroller[i].add(drawingPane[i]);
windows.addTab(floors.get(i).toString(), scroller[i]);
}

...


Die Zeile mit scroller[i].add(drawingPane[i]); verursacht hier die Exception.


Hat jmd eine Erklärung dafür?




so long,
minos

Abnaxos
2008-01-11, 16:12:17
scroller[i] ist noch null. :)

Monger
2008-01-11, 16:26:57
Ein Dings-Array ist nicht automatisch mit Dings gefüllt. Wenn du dir ein paar Saftbecher beim IKEA kaufst, ist da ja auch erstmal kein Saft drin.

Wenn du drüber nachdenkst, kann das auch gar nicht gehen. Nicht alle Objekte besitzen einen Standardkonstruktor, und können so einfach mal vorsorglich in einem Array erzeugt werden.
Ein Array MUSS explizit initialisiert werden! Ausnahmen bestätigen die Regel.

minos5000
2008-01-11, 16:28:02
Danke für den Tipp, es sind eben doch die kleinen Dinge, die einem das Leben schwer machen ;)

Monger
2008-01-11, 16:40:12
Noch ein kleiner Tipp: klammer dich nicht so sehr an Arrays!
In dem Beispiel mögen sie sogar Sinn machen, aber es passiert relativ selten, dass man Felder braucht die Lücken zulassen und eine fixe Größe haben. Außerdem sind Arrays (genauso wie Strings) eigentlich eine Anomalie in Java. So eine bizarre Syntax hat kein anderes Objekt.

Wenn du dich erstmal an dynamische Listen wie z.B. "ArrayList" gewöhnt hast, wirst du fast keine Arrays mehr benutzen. Da stolperst du auch nicht so leicht über solche bizarren Effekte wie Nullreferenzen.

minos5000
2008-01-11, 19:53:15
Ich versuche immer meinen Code möglichst effizient zu halten und wenn ich die Anzahl der benötigten Objekte kenne nehme ich eigentlich immer Arrays. Macht auf heutigen Rechnern geschwindigkeitsmäßig zwar keinen Unterschied, aber es gibt mit ein besseres Gefühl ;)

Monger
2008-01-11, 21:31:02
Einerseits versuchst du möglichst effizient zu sein, und andererseits machst du dann sowas? ;)


objects = new LinkedList<Objects>();
objects = dbCon.getAllObjects();

Du erzeugst ein neues Objekt, und schmeißt es im nächsten Moment sofort wieder weg?

Abnaxos
2008-01-12, 06:41:33
Ich versuche immer meinen Code möglichst effizient zu halten und wenn ich die Anzahl der benötigten Objekte kenne nehme ich eigentlich immer Arrays. Macht auf heutigen Rechnern geschwindigkeitsmäßig zwar keinen Unterschied, aber es gibt mit ein besseres Gefühl ;)
Ich mag jetzt hier keinen Vortrag halten, aber bitte glaube mir das: Wenn du ohne genaue Kenntnisse und vor allem Notwendigkeit von Vornherein zu sehr an die Performance denkst, wirst du ein Programm kriegen, das absolut unwartbar ist, und eine wesentlich schlechtere Performance an den Tag legt, als wenn du dich erstmal nicht darum gekümmert hättest.

Der Schuss, selber schlauer als die JVM zu sein, geht meist hinten hinaus und ist nicht zuletzt für den Ruf von Java verantwortlich, langsam zu sein.

minos5000
2008-01-12, 08:27:30
Einerseits versuchst du möglichst effizient zu sein, und andererseits machst du dann sowas? ;)


objects = new LinkedList<Objects>();
objects = dbCon.getAllObjects();

Du erzeugst ein neues Objekt, und schmeißt es im nächsten Moment sofort wieder weg?
Nobody is perfect ;)

HellHorse
2008-01-12, 15:12:36
....

Der Schuss, selber schlauer als die JVM zu sein, geht meist hinten hinaus und ist nicht zuletzt für den Ruf von Java verantwortlich, langsam zu sein.
Dazu reicht es schon wie hier geschehen im EDT DB abfragen zu machen! Dafür aber gutes Gefühl und Effizient durch Verwendung von Arrays ;)

minos5000
2008-01-12, 17:55:21
Dazu reicht es schon wie hier geschehen im EDT DB abfragen zu machen! Dafür aber gutes Gefühl und Effizient durch Verwendung von Arrays ;)
Sorry, aber ich kann nicht ganz folgen.

Abnaxos
2008-01-12, 19:05:41
Dazu reicht es schon wie hier geschehen im EDT DB abfragen zu machen! Dafür aber gutes Gefühl und Effizient durch Verwendung von Arrays ;)
OK, erwischt. :) Das ist jetzt ein Beispiel, wo Java sehr ineffizient wird, wenn man "aus dem Bauch hinaus" programmiert ...

Sorry, aber ich kann nicht ganz folgen.
Was HellHorse angesprochen hat, ist der Event Dispatch Thread. Alles, was im GUI passiert (Repaints, Behandlung von Events etc), wird in diesem einen Thread erledigt. Daher sollte man alles, was länger als "nicht wahrnehmbar kurz" dauert, aus diesem Thread auslagern, denn solange dieser Thread mit etwas anderem beschäftigt ist, macht das GUI garnichts, nichtmal neu Zeichnen liegt dann drin => es fühlt sich langsam an. Stichwort: SwingWorker.

The_Invisible
2008-01-12, 19:14:37
naja, das ist aber kein java problem sondern ein generelles problem was man mit so ziemlich jeder sprache und toolkit schaffen kann.

mfg

minos5000
2008-01-13, 01:09:29
I see, aber in dem Fall sollte das kein Problem sein, denn die ganze Initialisierung ist fertig, bevor das Fenster visible gesetzt wird.