Hallo zusammen,habe hier bei mir was gesehen was ein bisschen komisch ist.
Wollte daher mal fragen was richtig ist.
Bis jetzt habe ich die Arrays gleich am Anfang vom Konstruktorrumpf gemacht.
Da ich gleich ein Objekt erstellte und dies dann in den Array "reinmachte"
Ohne zu überlegen habe ich das auch mit einem JTextField Array gemacht. Also
Doch diese Felder erstelle ich erst nach dem Array.Die Folge ist, das ich keine Objekte in der Array habe.Ok damit es funktioniert habe ich diese Array zu unterst gemacht,nun klappt es.
Meine Frage nun,sollte man die Arrays immer am Schluss anfügen?Oder anders gesagt das erste was man im, Konstruktor macht ist Objekte zu erstellen?Damit man genau solche nullpoint fehler umgeht?
Ich bin noch nicht so erfahren im Programmieren, aber meine bisherige Feststellung (insbesondere bei GUI-Programmierung) ist, dass man am besten vom Kleinen ins Große und vom Inneren zum Äußeren geht.
Beispielsweise erst den JButton, den ich haben will, initialisieren, dann das JPanel, danach den JFrame. Anschließend den Button dem Panel und das Panel dem Frame hinzufügen. In deinem Beispiel wäre ja das Array die übergeordnete Instanz, darum würde ich es auch erst nach Initialisierung der benötigten Felder erstellen.
[...] (insbesondere bei GUI-Programmierung) [...] Beispielsweise erst den JButton, den ich haben will, initialisieren, dann das JPanel, danach den JFrame. Anschließend den Button dem Panel und das Panel dem Frame hinzufügen. .
Variablen, die in der kompletten Methode (oder Konstruktor) gebraucht werden, immer am Anfang deklarieren und nach Möglichkeit initialisieren. Geht in deinem Fall nicht, deshalb nur deklarieren.
Also bspw.
Java:
DeinKonstruktor(){Object[] f =newObject[13];// DeklarierenObject a =newObject();Object b =newObject();// ...
f[0]= a;// Initialisieren
f[1]= b;// ...
oder
Java:
DeinKonstruktor(){Object a =newObject();// DeklarierenObject b =newObject();// ... Hier stehen nur weitere Deklarationen + ggf. Initialisierungen in der selben ZeileObject[] f =newObject[13];
f[0]= a;// Initialisieren
f[1]= b;// ...
oder
Java:
DeinKonstruktor(){Object[] f =newObject[13];
f[0]=newObject();// Initialisieren
f[1]=newObject();// ...
oder
...
Solang du nicht irgendwo Deklarationen gefolgt von Logik gefolgt von weiteren Deklarationen hast, ist das alles ok. Auch würde ich nicht unbedingt so etwas machen:
Java:
DeinKonstruktor(){Object a =newObject();// DeklarierenObject[] f =newObject[13];Object b =newObject();// ...
f[0]= a;// Initialisieren
f[1]= b;// ...
[...] (insbesondere bei GUI-Programmierung) [...] Beispielsweise erst den JButton, den ich haben will, initialisieren, dann das JPanel, danach den JFrame. Anschließend den Button dem Panel und das Panel dem Frame hinzufügen.
Mit SWT habe ich noch nie gearbeitet, aber soweit ich das von deinem Codebeispiel beurteilen kann, muss beim Konstruktoraufruf vom Button der Container (hier Composite) bereits bekannt sein. Wenn das so ist, hat man natürlich keine Wahl und muss erst das übergeordnete Ding erstellen.
Mein Beispiel bezog sich jedoch auf einen Code wie diesen:
Java:
JButton button =newJButton("Hallo!");//noch mehr Buttons und Kram, der ins Panel sollJPanel panel =newJPanel();
panel.add(button);//panel.add(noch mehr Kram);JFrame frame =newJFrame("Dolles Fenster");
frame.add(panel);
Hab's mir halt übersichtlicher vorgestellt, wenn ich die einzelnen Teile erst dann erstelle, wenn ich sie auch wirklich brauche, und nicht am Anfang des GUI-Codes erst mal einen JFrame und mehrere Panels hinhaue, mich dann mit dem Erstellen von Buttons und ganz anderen Sachen beschäftige und erst am Schluss auf die Panels und den Frame zurückkomme. Ist vielleicht einfach auch Geschmackssache.
JButton button =newJButton("Hallo!");//noch mehr Buttons und Kram, der ins Panel sollJPanel panel =newJPanel();
panel.add(button);//panel.add(noch mehr Kram);JFrame frame =newJFrame("Dolles Fenster");
frame.add(panel);
Das ist bäh. Alle in einem Gültigkeitsbereich benötigte Variablen sollten direkt am Anfang dieses Gültigkeitsbereichs deklariert und asap initialisiert werden. Alles andere ist unübersichtlich und erschwert die Suche nach dem "Ursprung" einer Variablen.
@Haave: Jup bei SWT muss das parent-objekt bereits initalisiert sein. Ich würde auch von deiner Arbeitsweise abraten. Wenn du eine GUI baust, solltest du ungefähr wissen, wie diese später aussehen soll, insofern sollte es auch kein Problem sein, mit dem JFrame anzufangen und darauf alles zu setzen. Zudem würde ich auch, wie The_S geschrieben hat, meine Variablen früh definieren.
Okay, ich behalte im Hinterkopf, was ihr geschrieben habt, und mach einfach mal meine eigenen Erfahrungen ^^ (Hab bislang nie besonders umfangreichen GUI-Code geschrieben, deshalb war es nie wirklich unübersichtlich.)
Jetzt will ich aber nicht den Thread an mich reißen, sondern lieber den Fragesteller zu Wort kommen lassen.
Okay, ich behalte im Hinterkopf, was ihr geschrieben habt, und mach einfach mal meine eigenen Erfahrungen ^^ (Hab bislang nie besonders umfangreichen GUI-Code geschrieben, deshalb war es nie wirklich unübersichtlich.)
Geht nicht um GUI-Code sondern allgemein. Und dass du dich darin später wieder zurecht findest, stellt auch niemand in Frage, wenn du alle Projekte so aufbaust. Auch ist es bei dem konkreten Beispiel hier nicht sooooooooo dramatisch. Aber ein Außenstehender, der deinen Code (bspw. einen etwas komplexeren Algorithmus) lesen muss, wo kreuz und quer neue Variablen deklariert werden, wird sich wohl schwerer tun.
He danke für eure zahlreiche und gute Antworten
Meine Frage ist mehr als beantwortet :toll:
Aber ich kann mich diese GUI Fragen auch anschliessen sind gerade auch interessant.
Auch wegen der Reihenfolge.Klar all jene Elemente welche ich brauche deklariere ich im Datenfeld
//Konstruktor
a =newJFrame();
b =newJPanel();
knopf =newknopf();
Dann in der Methode paint,ist eben jetzt die Frage der Reihenfolge.
In der Schule wurde uns gesagt man soll von oben nach unten machen.Also
knopf ,b,a.
Aber ich finde es besser wenn ich von hinten beginne.Zuerst das a dann b dann der Knopf.
Noch eine 2Frage.
Die meisten Komponeten kann man ja einstellen.Ist diese Reihenfolge richtig?
Also wenn ich mit einer Komponente anfange stelle ich gleich alles ein bevor ich zur nächste gehe?