Java Quellcode Fehler

Hallo,

Ich danke dir dafür, dass du den Fehler entdeckt und mir probiert hast zu erklären. Leider habe ich es nicht ganz verstanden, könntest du daher im SSCCE einmal den Fehler beheben, die verbesserte Version hochladen und mir den Link schicken (du musst es nicht im Original Taschenrechner verbessern es reicht wenn du die Zusammenfassung des Problems, in der das Problem ja auch auftritt, verbesserst)
Hier nochmal der Link zum SSCCE:
http://www.doktus.de/dok/63288/sscce-fuer-taschenrec…
Wenn du dieses Programm so bearbeitest, dass es funktioniert kann ich es ja auf den Taschenrechner übertragen (wahrscheinlich kapier ich es dann auch)
Ich möchte mich erneut für deine Hilfe bedanken

mfg Maximilian

Hallo,

ich denke du hast das mit der Objektorientierung nicht ganz verstanden. Oder du stehst auf dem Schlauch bei der GUI.

In der main-Methode der Klasse a erstellst du ein Objekt c und fügst dort den Test-Button mit einem ActionListener hinzu. Soweit so gut.

Doch wenn man auf den Button klickt, also die actionPerformed()-Methode des ActionListeners dieses Buttons aufruft, wird ein neues Objekt b angelegt und auf diesem neuen Objekt wird dann b.Hallobesetzen(Hallo) aufgerufen. (Hier ist ebenfalls Hallo noch null. Das Feld wird davor noch nicht gesetzt.)
In der Methode b.Hallobesetzen() legst du dann ein neues Objekt c an und rufst auf diesem c.Buttonentfernen() auf. Dieses neue Objekt c, hat diesen Button noch gar nicht, weil man diesen eigentlich erst mit der Methode c.Buttonhinzufügen() hinzufügen müsste.
Dann wird die Methode c.ausgebenlassen() aufgerufen. In dieser wird wieder ein neues Objekt b erstellt. Dessen Felder sind natürlich unbesetzt da es ein neues Objekt ist. In der nächsten Zeile wird von diesem Objekt die b.ausgeben()-Methode aufgerufen. Das gibt dann null aus, da das Feld Hallo2 dieses Objekts natürlich null ist.

Ich habe eine verbesserte Version hier hochgeladen:
sscce.zip
sscce-jcc.zip

Die zweite zip-Datei enthält die gleichen Klassen nur mit Java Coding Conventions. Wobei ich nicht weiß wie ich die Klasse B namentlich bezeichnen soll. Daher habe ich sie so lassen.

1 Like

Hallo,

Danke für das Lösen meines Problems (deine letzte Antwort hat mein Problem endlich gelöst :smile: ).
Ich habe nicht einmal gewusst, dass man Objekte auf diese Weiße erstellen kann. Ich habe meine Kentnisse alle aus dem Internet (Ich lerne Java nämlich freiwillig, weil es mich interessiert) und dies kam in keinem Tutorial vor (keine Ahnung warum, wenn das doch so wichtig ist). auf den ganzen Internet-Seiten, wo ich alles war, habe ich es so gelernt wie ich es angewendet habe.
Naja egal, dank dir habe ich es jetzt auch gelernt (lieber später als nie)

mfg Maximilian

Hallo nochmal,

Das Problem ist leider immer noch nicht gelöst(habe mich vorhin getäuscht)
Denn was du nicht wusstest (meine Schuld) ist, dass ich Hallo2 erst „zwischenspeichern“ möchte und der Befehl zum Ausgeben soll aus einer anderen if-Bestimmung in der Klasse d (dem ActionListener) kommen. hier nochmal ein etwas ausführlicheres SSCCE und ich wäre dir dankbar, wenn du dies auch zum laufen bringen könntest:

http://www.mediafire.com/download.php?tunh2b4i675pshd

Moin,

so, ich habe mich nun mal wild in deinem Programm ausgetobt:

http://thislarge.net/Taschenrechner.zip

Wenn du das öffnest, bekomme keinen Schreck. Ich habe ziemlich viel geändert, aber auch immer kommentiert „warum“. Dein Fehler war eigentlich nur, dass du immer ein neues Objekt erzeugt hast. Somit ist die Variable zwar in einem Objekt gefüllt, aber nicht in dem du gerade die Methode aufrufst…

Ich möchte dir nicht zunahe treten, aber aus diesem Fehler schlussfolger ich, dass du die Zusammenhänge der OO-Programmierung noch nicht richtig verstanden hast und, wie du auch selber geschrieben hast, nur „ausprobiert“ hast. Glaube mir aus meiner eigenen Erfahrung, dies ist nicht besonders nachhaltig. Deswegen empfehle ich dir dringen, erst die Grundlagen zu verstehen.
Meine Änderungen sollen dir zeigen, wie man so eine Problemstellung etwas strukturierter angehen kann und zeigt dir eventuell etwas deutlicher, was ich mit dem „Verständnis“ meine.

Ein guter Einstieg ist das freie Buch: Java ist auch eine Insel.
http://openbook.galileodesign.de/javainsel5/index.htm
Ich empfehle dir dringend die ersten 6 Kapitel genau durchzuarbeiten. Sicher wird dort auch vieles nochmal erklärt, was du schon weißt. Aber oftmals stehen immer wieder nützliche Tipps dazwischen, die dir später so manche lange Suche nach Fehlern ersparen wird.
Die weiteren Kapitel kann man dann lesen, wenn man das Thema benötigt… :wink:

Und nochmal zur Schreibweise deines Codes. Schon klar, wenn ich was für mich schreibe, dann bin ich auch eher faul… :smiley: Aber in diesem Fall bittest du jemanden anderen dir zu helfen und deinen Fehler zu suchen. Und wenn ich jemanden anderen bitte seine Zeit zu investieren, dann mache ich alles, damit er es so einfach wie möglich hat. Dazu gehört die Klassen, Methoden und Variablen ordentlich zu benennen und so gut wie möglich zu kommentieren, was du an der Stelle erreichen möchtest… =)
Und glaube mir, wenn du dein Programm in einem Jahr wieder anschaust, dann bist du dir selber dankbar… :wink:

mfg Tim

Tag Maximilian,

ich habe gerade gesehen, dass Du auch noch andere gefragt hast. Deren Kommentaren kann ich nur zustimmen: Dein Code ist wirklich gruselig und zeigt, dass Dir Grundlegendes der Objektorientierung nicht klar ist. Lass Dich davon aber nicht entmutigen. Schließlich gibt es Bücher und am besten Kurse, wo es jemanden gibt, der Deine Sachen korrigiert.
Ich habe Deinen Code mal in eine Datei gepackt und hoffe, dass Dir die hinzugefügten print-Anweisungen zumindest zeigen, dass Deine erwartete Definition nicht zutrifft. Ob Dir dadurch ein Licht aufgeht, wage ich zu bezweifeln, doch können solche antworten hier keinen Java-Kurs ersetzen.

import java.awt.\*;
import java.awt.event.\*;
import javax.swing.\*;

public class A {
 public static void main (String[] args){
 C c = new C();
 c.buttonHinzufügen();
 c.setDefaultCloseOperation(JFrame.EXIT\_ON\_CLOSE);
 c.setSize(500,500);
 c.setVisible(true);
 } 
}

//b.java:

class B {
 public String hallo2;
 public void halloBesetzen(String hallo){
 hallo2 = hallo;
 C c = new C(); // Diese Instanz von C hat mit der in A erzeugten überhaupt nichts zu tun.
 c.buttonEntfernen();
 c.ausgebenlassen();
 }
 public void ausgeben(){
 System.out.println(hallo2); 
 }
}


//c.java mit ActionListener d:

class C extends JFrame{
 public JButton test;

 public C(){
 super("???"); 
 setLayout(new FlowLayout());
 test = new JButton("Halli-Hallo");
 }

 public void buttonHinzufügen(){
 add(test);
 D actionListener = new D();
 test.addActionListener(actionListener);
 }

 public void buttonEntfernen(){
 remove(test);
 D actionListener = new D();
 test.removeActionListener(actionListener);// Was soll das denn?
 }

 public void ausgebenlassen(){
 B b = new B();
 System.out.println("b.hallo2: "+b.hallo2);
 b.ausgeben();
 }

 public String hallo;

 public class D implements ActionListener{
 public String abc;
 public void actionPerformed(ActionEvent e){
 if (e.getSource()==test){
 B b = new B(); 
 abc = e.getActionCommand();
 System.out.println("Definition von \"hallo\": "+hallo);
 b.halloBesetzen(hallo); 
 } 
 }
 }
}

Hallo,

bevor ich mich daran mache das zum Laufen zu bekommen, solltest du dir überlegen ob die Struktur deines Programmes sinnig ist.

Im Moment schaut es so aus, dass Klasse a einen JFrame c erstellt und anzeigt.
Bei der Erstellung wird dann auch ein Button angelegt und an diesen einen ActionListener angehängt.

Wenn nun dieser ActionListener ausgeführt wird, wird eine neue Klasse b erstellt (wozu eigentlich?) in der dann ein neuer Frame c angelegt wird. Dieser ist wieder ein eigenständiger Frame mit eigenem, neuen Button und Textfeld. Diese können überhaupt nicht wissen welchen String du ausgegeben haben willst.

Ich habe das jetzt ein bisschen verändert.
Man braucht ja nur einen ActionListener, da in diesem sowieso unterschieden wird welche Action ausgeführt wird. Deswegen gibt es einen pro Klasse c und dieser wird im Konstruktor erstellt.
Er bekommt das gerade erstellte Objekt c als Parameter beim Erstellen, damit er eine Referenz darauf hat und so Zugriff auf dessen Felder hat.

Nun wird der Button angezeigt und wenn darauf geklickt wird, wird der Button entfernt und das Eingabefeld angezeigt.

sscce2.zip