Speichern in eine .txt klappt.. fast

Zerstoerrer

Mitglied
Hallöchen!

Ich hab' ein kleines Problem, für das ich einfach keine Lösung finde.
Und zwar habe ich ein GUI mit einigen JTextFields geschrieben und das, was dort eingegeben wird, soll in eine .txt Datei gespeichert werden. Wie das grundsätzlich funktioniert, weiß ich, aber es funktioniert nicht so wirklich. Es wird zwar eine Datei angelegt, auch mit dem richtigen Namen, aber wenn man sie öffnet ist sie leer! 🙁
Entweder bin ich das ganze komplett falsch angegangen oder es liegt daran, dass das Speichern in einer anderen Methode ist, als das Eingeben... hier einfach mal einige Auszüge aus meinem Code, vielleicht fällt jemandem was auf. D:

Java:
if(event.getActionCommand()== "NeuesRezept") {                                      //Event für den Klick auf den Button 'Weiter'

            getContentPane().removeAll();
            getContentPane().repaint();
            getContentPane().setLayout(null);

            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                         //wen man auf X klickt wird das Programm beendet
        contentPane = new JPanel();                                             //Hauptfenster als JPanel
        contentPane.setBackground(new Color(130, 209, 255));                    //Hintergrund des JPanels

        setContentPane(contentPane);
        contentPane.setLayout(new GridLayout(1, 2, 5, 0));                       //Unterteilen des JPanels D:

        JPanel linkeSeite = new JPanel();                                         //Erstellen eines JPanels für die linke Buchseite
        linkeSeite.setBackground(new Color(169, 224, 255));                       //Hintergrundfarbe der linken Seite
        FlowLayout fl_linkeSeite = (FlowLayout) linkeSeite.getLayout();            //FlowLayout für die linke Seite erstellen
        fl_linkeSeite.setAlignment(FlowLayout.LEFT);                                //FlowLayout für die linke Seite einstellen
        contentPane.add(linkeSeite);

        JLabel HeadingInputNewRecipe = new JLabel("Neues Rezept eingeben");                      //Text auf der linken Seite
        linkeSeite.add(HeadingInputNewRecipe);                                         //Text der linken Seite  an die linke Seite anfügen
        linkeSeite.setLayout(null);
        HeadingInputNewRecipe.setBounds(40, 40, 360,24);
        HeadingInputNewRecipe.setFont(new Font("Verdana", Font.BOLD, 20));             //Einstellungen des JLabels

        JLabel RecipeTitle    = new JLabel( "Geben Sie den Titel des Rezepts ein:  " ) ;
        TextField RecipeTitleInText  = new TextField( 15 );
        RecipeTitle.setVisible(true);
        RecipeTitleInText.setVisible(true);
        linkeSeite.add(RecipeTitle);
        RecipeTitle.setBounds(40, 79, 360,18);
        linkeSeite.add(RecipeTitleInText);
        RecipeTitleInText.setBounds(40, 100, 250,18);                    //.. hier folgen noch einige Komponenten..

und dann

Java:
if (event.getActionCommand()=="speichern") {


         String SpeicherplatzEingabe = JOptionPane.showInputDialog(this, "Auf welcher Seite soll gespeichert werden (1-20)?", "Speichern",JOptionPane.PLAIN_MESSAGE);
         JFrame Test= new JFrame();
         JLabel TestText = new JLabel(  SpeicherplatzEingabe );
         Test.add(TestText);
         TestText.setVisible(true);
         Test.setVisible(true);
         Test.setSize(300,150);
         int Speicherplatz = Integer.parseInt(SpeicherplatzEingabe);

         KochbuchSeite [] KochbuchSeiteInhalt = new KochbuchSeite [20];
         for (int i = 0; i < 20; i++){
             KochbuchSeiteInhalt[i] = new KochbuchSeite();
         }
         File datei = new File(Speicherplatz + ".txt");
         try{
         FileWriter FWriter = new FileWriter(datei, true);
         BufferedReader FReader = new BufferedReader(new FileReader(Speicherplatz + ".txt"));
         TextField RecipeTitleInText  = new TextField( 15 );
         KochbuchSeiteInhalt[Speicherplatz].RecipeTitleS = RecipeTitleInText.getText();
         FWriter.append(KochbuchSeiteInhalt[Speicherplatz].RecipeTitleS + "\r\n");
         }
         catch(IOException ioexcept)
         {

         }

        }

Beides befindet sich natürlich in sowas🙂
Java:
public void actionPerformed(ActionEvent event)                                            
    {}

Wahrscheinlich liegt es daran, dass das Programm nicht wirklich auf die Eingabe zugreifen kann?? Ich hab keine Ahnung, was ich ändern muss, damit es funktioniert. 🙁
Wenn jemand eine Idee hat würde ich mich sehr freuen!
lg
 
Java:
TextField RecipeTitleInText  = new TextField( 15 );
KochbuchSeiteInhalt[Speicherplatz].RecipeTitleS = RecipeTitleInText.getText();
FWriter.append(KochbuchSeiteInhalt[Speicherplatz].RecipeTitleS + "\r\n");

Zuerst wird ein neues TextField erzeugt, danach den Text genommen und dieser eingespeichert, ein TextField müsste bei der Erzeugung leer sein.
 
Ja... das hab' ich von weiter oben hinkopiert, weil erst die Fehlermeldung kam, dass die Variable nicht bekannt sei. 🙁 Wie schaff ich das denn, dass das, was ich eingegeben hab, erst gespeichert wird, wenn ich auf Speichern klicke? Also wenn das ActionCommand "speichern" gesendet wird?

Edit: Und auf die Gefahr hin, mich als totalen Anfänger zu outen: Was ist ein Flush? 😀
 
Du musst das TextField erzeugt haben, noch bevor der Button "Speichern" geklickt werden kann. Schließlich muss der Benutzer dort etwas eingegeben haben. Achte nur darauf, dass du in dem ActionListener des Speicher-Buttons auf das TextField zugreifen kannst.
 
Erzeugt wird es ja vorher. Das Fenster ist auf und die TextFields sind da. Und dann erst kann man Speichern klicken. ABer das mit dem Zugreifen funktioniert wohl nicht..
 
JCODA hat bereits die betreffende Stelle rauskopiert. Du erzeugst ein leeres TextField, das sofort seinen Inhalt (=leer) in die Textdatei schreibt. Natürlich ist die dann leer. Du brauchst in deiner ActionListener-Klasse das TextField-Objekt, das vorher erzeugt werden musste. Beim Erzeugen des entsprechenden Listeners kannst du das TextField im Konstruktor übergeben, sodass du das Objekt dann parat hast.

flush bedeutet, dass alles was sich im Buffer (Zwischenspeicher) eines gepufferten Streams befindet, gesendet wird.

lg

P.S.: Es ist immer gefährlich, wenn du einen Haufen Code in einem try-Block hast, den catch-Block leer zu lassen. Dadurch bekommst du keinerlei Exception angezeigt, und die willst du aber wissen. Insofern schreibe in den catch-Blcok sowas wie "System.out.println("Ich bin ein Fehler");", damit du weißt, ob etwas schief läuft beim Speichern.
 
Zuletzt bearbeitet von einem Moderator:
Java:
event.getActionCommand()=="speichern"
Strings vergleicht man mit equals.
 
JCODA hat bereits die betreffende Stelle rauskopiert. Du erzeugst ein leeres TextField, das sofort seinen Inhalt (=leer) in die Textdatei schreibt. Natürlich ist die dann leer. Du brauchst in deiner ActionListener-Klasse das TextField-Objekt, das vorher erzeugt werden musste. Beim Erzeugen des entsprechenden Listeners kannst du das TextField im Konstruktor übergeben, sodass du das Objekt dann parat hast.

Klingt einleuchtend! 😀 Noch eine Frage zum Schluss: Wie übergebe ich das TextField? 🙂

Danke auch für den Tipp mit der leeren Catch-Schleife! 😉
 
Weiß das niemand? 🙁 Ich hab wirklich keine Ahnung, wie das funktionieren könnte und da ich nicht genau weiß, wonach ich eigentlich suche, hab' ich sonst auch nix dazu gefunden!

Es wäre wirklich toll, wenn mir jemand weiterhelfen könnte!
 
Also: Du hast ein Fenster, in dem ein TextField existiert und daneben ein Button zum Speicher, oder?
Diesem Button musst du ja mittels addActionListener(ActionListener a) ein Objekt vom Typ ActionListener übergeben. Diese Klasse ist aber ein Interface, d.h. du schreibst dir deine eigene Klasse, die das Interface ActionListener implementiert. In dieser Klasse überschreibst du dann die Methode actionPerformed(Event e), die aus dem Interface geerbt wurde. Diese Methode wird immer dann aufgerufen, wenn auf den Speicher-Button gedrückt wurde. Jetzt musst du nur noch darauf achten, dass du innerhalb der actionPerformed()-Methode auf das TextField zugreifen kannst, da du ja bei Drücken des Buttons den Inhalt benötigst. D.h., deine eigene ActionListener-Klasse bekommt noch zusätzlich die Eigenschaft "TextField text;", die du im Konstruktor setzt: meineActionListenerKlasse(TextField text) {this.text=text;}
Nun kannst du innerhalb der actionPerformed()-Methode auf text zugreifen und den eingetippten Text über text.getText() auslesen.
Ich hoffe das war ausführlich genug^^

lg
 
Du hast eine Klasse, die das Fenster repräsentiert und indem TextField und Button liegen:

Java:
public class meinFenster extends Frame {
         
          TextField textfeld = new TextField();
           // Einstellungen, etc.

          Button speichern = new Button("Speichern");
           // Einstellungen, etc.

         speichern.addActionListener(new meinActionListener(textfeld));
         // In der oberen Zeile füge ich dem Button meinen ActionListener hinzu. Wichtig ist, dass ich diesem das Textfeld übergebe!

}

Hier dein ActionListener:

Java:
public class meinActionListener implements ActionListener {
         
          TextField textfeld;
          
          public meinActionListener(TextField textfeld) {
                    this.textfeld=textfeld;
          }    
          // Mittels diesem Konstruktor wird beim Erzeugen das TextField aus der Fenster-Klasse entgegen genommen.

          public void actionPerformed(ActionEvent e) {
                    File datei = new File(); //Datei erzeugen, usw.
                    String inhalt = textfeld.getText(); //Inhalt aus dem Textfeld auslesen
                    datei.write(inhalt); //In Datei schreiben (in dem Fall nur Pseudocode, du benötigst natürlich Streams, etc.)
          } 
}

Achte auch darauf, alle benötigten Packete einzubinden. Wenn du das vom Prinzip vertanden hast, müsstest du es auch auf ein Beispiel übertagen können. Ansonsten musst du bitte genau sagen, was daran unklar ist.

lg

P.S.: Strings vergleicht man mit
Java:
meinString.equals(vergleichsString)
Bessere das noch aus!
 
Also mein Problem ist, dass ich es nicht schaffe, das Prinzip auf mein Programm zu übertragen. Dieses hat schon fast 400 Zeilen und ich weiß einfach nicht, wo ich wie ansetzen soll.
Fängt schonmal damit an, dass ich eine Klasse habe, die sowohl mein Fenster darstellt als auch den ActionListener implementiert, also
Java:
public class Kochbuch_Lena_Altstadt_info1 extends JFrame implements ActionListener {...

und IN dieser Klasse befindet sich der GESAMTE Rest des Codes.
Weiter habe ich keinen Speicher-Button, sondern wenn man eine Neue Eingabe startet baut sich der gesamte JFrame neu auf und dem JMenu wird ein weiteres MenuItem angefügt, nämlich das zum Speichern. Also habe ich dem Menü einen ActionListener zugefügt, für das Erstellen einer neuen EIngabe
Java:
jmiNew=new JMenuItem("Neu...");                                      //MenüItem, also Unterpunkte(Neu)
               menuRecepy.add(jmiNew);                                              //Anfügen des MenüItems an das Rezeptemenü
               jmiNew.setActionCommand("NeuesRezept");                            
               jmiNew.addActionListener(this);

Betätigt man also den Punkt "Neu..." im Menü, baut sich das Feld neu auf, was hier drin steht:
Java:
 public void actionPerformed(ActionEvent event)                                            //Events
    {

       
         if (event.getActionCommand()=="schließen") {                                          //wenn "schließen" angeklickt wird
            System.exit(0);                                                                    //Programm wird beendet
        }
        if(event.getActionCommand()== "NeuesRezept") {                                      //Event für den Klick auf den Button 'Weiter'

           NeuesRezept();

        }
        if (event.getActionCommand()=="speichern") {

         String SpeicherplatzEingabe = JOptionPane.showInputDialog(this, "Auf welcher Seite soll gespeichert werden (1-20)?", "Speichern",JOptionPane.PLAIN_MESSAGE);
         JFrame Test= new JFrame();                                       //
         JLabel TestText = new JLabel(  SpeicherplatzEingabe );            //
         Test.add(TestText);                                               // nur ein Test ob das OptionPane funktioniert
         TestText.setVisible(true);                                         //
         Test.setVisible(true);                                            //
         Test.setSize(300,150);
         int Speicherplatz = Integer.parseInt(SpeicherplatzEingabe);

         KochbuchSeite [] KochbuchSeiteInhalt = new KochbuchSeite [20];
         for (int i = 0; i < 20; i++){
             KochbuchSeiteInhalt[i] = new KochbuchSeite();
         }
         File datei = new File(Speicherplatz + ".txt");
         try{
         FileWriter FWriter = new FileWriter(datei, true);
         BufferedReader FReader = new BufferedReader(new FileReader(Speicherplatz + ".txt"));
         TextField RecipeTitleInText = new TextField(15);
         KochbuchSeiteInhalt[Speicherplatz].RecipeTitleS = RecipeTitleInText.getText();
         FWriter.append(KochbuchSeiteInhalt[Speicherplatz].RecipeTitleS + "\r\n");
         }
         catch(IOException ioexcept)
         {
          System.out.println("Ich bin ein Fehler >:(");    //nur falls was nich läuft..
         }


        }

Und hier ist das Problem... Die TextFields befinden sich jah in meiner Methode "NeuesRezept();", mein Speichervorgang befindet sich in der actionPerformed()-Methode. Ich dachte auch schon, dass man die if-Klammern vielleicht ineinander schreiben muss, aber dann kann man den SPeichern-Menüpunkt gar nicht mehr betätigen.
Ich hoffe, mein Code-geposte hat nicht für unnötige Verwirrung gesorgt, schließlich bin ich selbst schon genug verwirrt. 🙂
 
Hmm, erstz einfach mal alle String-Vergleiche wie besprochen durch .equals(). Möglicherweise kommst du gar nicht erst in die if-Blöcke hinein.
 
Zuletzt bearbeitet von einem Moderator:
Funktioniert auch nicht.. außerdem hat das Schließen und die Eingabe auch vorher schon funktioniert.. das Problem ist doch, dass meine if-Klammer fürs Speichern die Daten aus den TextFields der EIngabe nicht sehen bzw verarbeiten kann, oder?
 
Wenn du wirklich alles in einer Klasse hast (was nicht empfehlenswert ist), dann solltest du eine Klassenvariable vom Typ TextField einbauen. Diese speichert das erzeugte TextField und auf diese greifst du dann in deinem if-Block zu.
 
Hab ich auch schon probiert, dann heißt es:


Kochbuch_Lena_Altstadt_info1.java:354:60: cannot find symbol
symbol : variable RecipeTitleInText
location: class Kochbuch_Lena_Altstadt_info1
KochbuchSeiteInhalt[Speicherplatz].RecipeTitleS = RecipeTitleInText.getText();
 
Jep, weil du sie innerhalb eines anderen if-Blocks deklarierst und sie damit nur dort sichtbar ist (siehe erster Post von dir). Mach sie daher wie gesagt global, indem du das erzeugte TextField in eine Klassenvariable einfügst, auf die du dann überall zugreifen kannst.
 
Okay, also ich hab' es rausgefunden. Und zwar musste ich mein TextField global ganz am Anfang der Klasse deklarieren, also das
Java:
TextField name = new TextField (15);
einfach aus meiner mEthode rausnehmen und an den Anfang schreiben. Somit konnte ich in meiner Speichern-if-Klammer darauf zugreifen. Und das Speichern in eine Datei hat nicht funktioniert, weil die Zeile
Java:
FWriter.close();
gefehlt hat. Danke an alle für die Hilfe, ohne Euch hätte ich den Fehler vermutlich nie gefunden! 😀
 
Ohje, tut mir Leid. 😀 Ich stand total auf dem Schlauch, hat man sicher gemerkt. 🙂
Und vielen Dank nochmal!
Wenn's denn funktioniert macht es schließlich Spaß.. 😀
 

Zurück
Oben