2012-04-07 11 views
0

3rd Code Sample contains the error - how to solve?Referenz auf Objekt, das als Parameter

übertragen wurde Im folgenden Code habe ich eine Methode namens "Generator" generiert. Diese Methode empfängt ein JTextField und ein JLabel als Parameter.

Es generiert individuelle JPanels und fügt sie auf ein anderes JPanel (das mit dem Border "Vermieter"). Das Ergebnis wie dieses (rot markiert) aussehen sollte:

http://imageshack.us/photo/my-images/853/stammdateneraffsenguibe.png/

hier habe ich die die JTextFields als Felder am Instanziierung:

private JTextField txtplzvermieter; 
private JTextField txtemailvermieter; 
private JTextField txtgeburtsdatumvermieter; 
private JTextField txthandyvermieter; 
private JTextField txtidvermieter; 
private JTextField txtnamevermieter; 
private JTextField txtortvermieter; 
private JTextField txtstrassevermieter; 
private JTextField txttelefonvermieter; 
private JTextField txtvornamevermieter; 

hier ich meine Methode nenne, die ich oben

beschrieben
 public void vermieterPanel(JPanel verPanel){ 
     verPanel.add(generator("ID", txtidvermieter)); 
     verPanel.add(generator("Name", txtnamevermieter)); 
     verPanel.add(generator("Vorname", txtvornamevermieter)); 
     verPanel.add(generator("Straße", txtstrassevermieter)); 
     verPanel.add(generator("PLZ", txtplzvermieter)); 
     verPanel.add(generator("Ort", txtortvermieter)); 
     verPanel.add(generator("Geburtsdatum", txtgeburtsdatumvermieter)); 
     verPanel.add(generator("Telefon", txttelefonvermieter)); 
     verPanel.add(generator("Handy", txthandyvermieter)); 
     verPanel.add(generator("E-Mail", txtemailvermieter)); 

und hier ist die Methode Generator, die den Fehler enthält:

 public JPanel generator(String lableText, JTextField s){ // generiert ein Panel mit einer Zeile aus lable + TextFeld 

    JPanel gens = new JPanel(); 
    JLabel lable = new JLabel(lableText); 
    lable.setPreferredSize(new Dimension(100,25)); 

    s = new JTextField(); 
    s.setPreferredSize(new Dimension(200, 25)); 


    gens.add(lable); 
    gens.add(s); 
    return gens; 
    } 

später habe ich keinen Hinweis auf meine TeftFields mit .getText(); bekommen kann, weil ich einen Verweis auf eine neue JTextField-Objekt hier s = new JTextField();

erstellt haben, wenn ich die Zeile entfernen, um meine Objekte zugreifen ich eine Null-Zeiger-Ausnahme.

Was mache ich falsch?

Antwort

0

Natürlich erhalten Sie eine Ausnahme, weil Sie das JTextield übergeben, bevor Sie es initialisieren !!
Sie deklarieren es einfach,
initialisieren Sie es mit dem neuen Schlüsselwort, bevor Sie es als Parameter übergeben.

+0

Whops. Vergessen Sie zu erwähnen, dass Sie eine Methode initComponents aufrufen, die auf die JTextFields verweist. Auch wenn ich die JTextFields wie folgt deklariere: private JTextField txtplzvermieter = new JTextField(); private JTextField txtemailvermieter = new JTextField(); private JTextField txtgeburtsdatumvermieter = new JTextField(); private JTextField txthandyvermieter = new JTextField(); private JTextField txtidvermieter = neue JTextField(); Ich bekomme immer noch den gleichen NullPointer – RCK69

+0

Debug der Code und moniter Ihr Feld an der Stelle des Eingangs des Generators und sehen was passiert ist – GingerHead

+0

THX! Als ich debuggte, sah ich, dass die Generator() - Methode in Ordnung war! Der Fehler war hier: mieterPanel (MietPanel); mieterPanel (mietObjektPanel); Die zweite Zeile verursachte den Fehler, weil "mietObjektPanel" nur ein paar zufällige Sachen enthielt (was den Nullzeiger verursachte) und fügte es mieterPanel statt eines neuen Panel ... hinzu, als ich ein neues Panel erstellte und das mietObjektPanel mit dem Generator erstellte() -Methode Es funktionierte wie ein Zauber. Niemals den Debugger benutzt, bevor ich eine neue Fähigkeit gelernt habe - thx – RCK69

0

Die ursprünglichen Werte werden nie gemacht. Sie müssen dies tun

private JTextField txtplzvermieter = new JTextField(); 

für jeden von ihnen. Aber es muss außerhalb der Methode sein, nicht innerhalb.

+0

Vielen Dank für Ihren Vorschlag, aber ich habe das schon versucht. Wenn ich die Zeile entfernen, dann erhalte ich eine Nullpointer: Exception in thread "AWT-Eventqueue-0" java.lang.NullPointerException \t bei database.Gui.generator (Gui.java:192) \t bei Datenbank. Gui.mieterPanel (Gui.java:173) \t bei Datenbank.Gui.StammdatenErfassen (Gui.java:139) \t bei database.Gui.actionPerformed (Gui.java:241) – RCK69

0

In java Sie nicht ein Objekt als Referenz passieren kann, passiert es nie
dies war das Ziel der Schaffung java Sprache, minimale Speicherverwaltung
Wenn Sie ein Objekt als Parameter übergeben, die Kopie der Referenz des Objekts wird
übergeben, so dass jede Änderung an den Objekten 'field s widergespiegelt wird, außer wenn es mit einem neuen Objekt mit dem Schlüsselwort new zugewiesen wird, hier verlieren Sie den Greifer Ihres Objekts versuchen Sie Ihre JFeld s als global classfield s und leiten sie nicht an eine Methode durch Parameter-Abschnitt.

+0

thx - das war sehr nützlich! Meine JFields sind bereits globale Klassenfelder! Wenn ich die Referenz auf dem Objekt nicht übergeben kann, wie kann ich die Methode "Generator" universell schreiben, so dass es die JPanel (mit JLabel und JTextfield) für jedes dieser TextFields generiert? – RCK69

+0

@ RCK69 las meine andere Antwort – GingerHead

Verwandte Themen