Objekte einer Oberfläche in eine Datei/Ordner speichern

Daito

Mitglied
Hallo Leute,

bin Einsteiger in der Java Programmierung und hab das Problem, dass ich Informationen, die ich in JTextField(s) eingebe nicht durch die Betätigung eines Buttons gespeichert kriege.

Buttons und Felder sind erstellt. Auch den ActionListener habe ich bereits eingefügt. Jedoch fehlt mir der Ansatz für die Methode des "Klicks". Ich möchte, dass die Strings, die ich in die 3 Textfelder einfüge durch den Klick des Buttons in einen Ordner eingefügt werden (als Textdatei oder als Name des Ordners)

Mein Programmcode sieht derzeit folgendermaßen aus:


Java:
import javax.swing.*;
import java.awt.event.*;

public class Oberflaeche extends JFrame {
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    JTextField textfield1;
    JTextField textfield2;
    JTextField textfield3;
    JButton button;

    public Oberflaeche(){
   
        this.getContentPane().setLayout(null);
        this.initWindow();

}
    protected void initWindow() {
   
   
    button = new JButton("Fall erstellen");
    button.setBounds(130,110,150,20);
    this.getContentPane().add(button);


button.addActionListener(new ActionListener(){
  
        public void actionPerformed(ActionEvent arg0) {
           buttonErstelleClicked();
       }
    });
    public void buttonErstelleClicked()
  {
        ?!?!?!?!??!?!?!
  
    }




    textfield1 = new JTextField("Bearbeiter:");
    textfield1.setBounds(5, 10, 170, 30);
    this.getContentPane().add(textfield1);

    textfield2 = new JTextField("Aktenzeichen:");
    textfield2.setBounds(190,10,170,30);
    this.getContentPane().add(textfield2);

    textfield3 = new JTextField("Delikt:");
    textfield3.setBounds(110, 60, 170, 30);
    this.getContentPane().add(textfield3);



    }
   }


Also mir ist klar, dass ich einen Outputstream öffnen muss, um diese Dateien in Form von Bytes zu speichern. Auch, dass ich die Objekte serialisierbar machen muss. Aber ich hab gerade echt keinen Ansatz.. Vorschläge?

Mfg
 
Zuletzt bearbeitet von einem Moderator:
Könntest du bitte näher beschreiben wo dein Problem liegt?

Beim abspeichern oder beim Zugriff auf die Werte die dann in den Textfelder stehen sollen.
Wenn das Problem beim speichern liegt bitte genauer beschreiben ob der Ordner nun so heißen soll, oder die Datei, öde rob du einfach alles in eine Datei packen willst 😉
Gruß Cookie
 
Guddi,

also ich möchte die ersten 2 Strings in eine gemeinsame Textdatei speichern und diese Textdatei wiederum soll in einen Ordner geschoben werden, der als Name den 3. String besitzt. Ist dies umsetzbar?
Mfg
 
Ja das ist umsetzbar. Die Methode JTextField. gettext() liefert dir den Inhalt. Alles was du dann noch brauchst ist ein filewriter deiner Wahl, der das ganze schreibt.
Auch den Ordner kannst du erstellen das hab ich gerade nicht im Kopf, werde ich aber nachzeichnen sobald ich zuhause bin.

Ps: Anstatt den Text was ins Feld soll kannst du mit einem JLabel die Beschreibung auch davor setzen.
 
So. Frisch angekommen.

Schau, ich hab dir hier mal kurz was implementiert. Ich hoffe das ist verständlich, hab mich bemüht das leserlich zu schreiben 😉

Zunächst mal die Main.

Java:
public class Main {

    public static void main(String[] args) {
        Oberflaeche oberflaeche = new Oberflaeche();
        oberflaeche.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        oberflaeche.setSize(new Dimension(400, 400));
        oberflaeche.setVisible(true);

    }

}

Und jetzt noch die Oberflaeche.

Java:
public class Oberflaeche extends JFrame {
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    JTextField tfBearbeiter;
    JTextField tfAktenzeichen;
    JTextField tfDelikt;

    JLabel lblBearbeiter;
    JLabel lblAktenzeichen;
    JLabel lblDelikt;

    JButton btnFallErstellen;

    public Oberflaeche() {

        this.getContentPane().setLayout(null);
        this.initWindow();

    }

    protected void initWindow() {

        getBtnErstellen();

        getContentBearbeiter();
        getContentAktenzeichen();
        getContentDelikt();

    }

    private void getContentBearbeiter() {
        lblBearbeiter = new JLabel("Bearbeiter:");
        lblBearbeiter.setBounds(5, 10, 170, 30);
        this.getContentPane().add(lblBearbeiter);

        tfBearbeiter = new JTextField();
        tfBearbeiter.setBounds(180, 10, 170, 30);
        this.getContentPane().add(tfBearbeiter);
    }

    private void getContentAktenzeichen() {
        lblAktenzeichen = new JLabel("Aktenzeichen:");
        lblAktenzeichen.setBounds(5, 50, 170, 30);
        this.getContentPane().add(lblAktenzeichen);

        tfAktenzeichen = new JTextField();
        tfAktenzeichen.setBounds(180, 50, 170, 30);
        this.getContentPane().add(tfAktenzeichen);
    }

    private void getContentDelikt() {
        lblDelikt = new JLabel("Delikt:");
        lblDelikt.setBounds(5, 90, 170, 30);
        this.getContentPane().add(lblDelikt);

        tfDelikt = new JTextField();
        tfDelikt.setBounds(180, 90, 170, 30);
        this.getContentPane().add(tfDelikt);
    }

    private void getBtnErstellen() {
        btnFallErstellen = new JButton("Fall erstellen");
        btnFallErstellen.setBounds(5, 130, 150, 20);
        this.getContentPane().add(btnFallErstellen);

        btnFallErstellen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                try {
                    String defaultPath = getDefaultPath();
                    createOutputDirectory(defaultPath);
                    writeDataToFile(defaultPath);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    protected String getDefaultPath() {
        // Hier wird der erste Teil des OutputPaths gesetzt. (kann man sicher
        // schöner machen, aber das tut für den Zweck)
        return "file:/C:/Users/Public/workspace/";
    }

    protected void createOutputDirectory(String defaultPath) throws IOException {

        Files.createDirectories(getOutputPath(defaultPath));
    }

    private void writeDataToFile(String defaultPath) throws IOException {

        BufferedWriter writer = Files.newBufferedWriter(getFilePath(defaultPath), StandardCharsets.UTF_16LE);

        writer.write(lblBearbeiter.getText().concat(tfBearbeiter.getText()));
        writer.write(System.lineSeparator());
        writer.write(lblAktenzeichen.getText().concat(tfAktenzeichen.getText()));

        writer.flush();
        writer.close();

    }

    private Path getFilePath(String defaultPath) {
        // Hier den gewünschten Filenamen zuweisen, ich setze hier nur einen
        // Platzhalter
        String fileName = String.valueOf(System.currentTimeMillis()).concat(".txt");
        Path filePath = Paths.get(URI.create(defaultPath.concat(tfDelikt.getText()).concat("/").concat(fileName)));
        return filePath;

    }

    private Path getOutputPath(String defaultPath) throws IOException {
        Path dirPath = Paths.get(URI.create(defaultPath.concat(tfDelikt.getText())));
        return dirPath;

    }
}

Anpassungen und Eingabeprüfungen musst du noch selbst vornehmen 😉
Aber das hier sollte als Grundgerüst tun.

Gruß, Cookie
 
Ich bins nochmal 🙂
Hab das ganze gestern ausprobieren könnnen und es funktionierte nur, wenn ich am Ende bei der getFilePath-Methode den Outputpath übergebe quasi so:
Code:
 private Path getFilePath(String defaultPath) {

        String fileName = String.valueOf(System.currentTimeMillis()).concat(".txt");
        Path filePath = Paths.get("");
        try {
            filePath = Paths.get(getOutputPath(defaultPath).toString() + File.separator + "Allgemein" + fileName);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

Nun will ich eine weitere Oberfläche erstellen, die Textdateien erzeugt und in den Ordner schiebt, den man zuvor erstellt hat. Im Prinzip ist das Erstellen und Verschieben dieser Datei kein Problem mehr. Jedoch frag ich mich, wie ich mit dem Dateipfad umgehen muss, da ich ja keinen festen eingeben kann. Dieser ist ja abhängig vom Name des vorher erzeugten Ordners..
Außerdem müsst ich noch ne Art Liste erstellen, in der ich auswählen kann, in welchen Ordner das Zeug reinkommt (Im falle ich hab schon mehrere erstellt)
Ich klick mich mal noch ein wenig durchs Netz, vll hat ja einer einen kleinen Denkanstoß für mich

Liebe Grüße
 
Hey,

irgendwie lassen sich meine Beiträge nicht editieren, deswegen sorry für die Doppelbeiträge.
Hab nun grundlegend das erreicht, was ich wollte. Leider gibts einen Fehler.

Mittels der ersten Oberfläche erstelle ich Fälle als Ordner an einen Dateipfad. Der zweite Button erzeugt eine zweite Oberfläche, an der ich per ComboBox die verschiedenen Ordner auswählen kann. Hier kann ich wiederum Textdateien erstellen, die eigentlich dem ausgewählten Ordner hinzufügen müsste.
Anbei seht ihr den Code beider Oberflächen. Ich glaube es ist eine URI/File frage.. muss das wohl irgendwie vereinheitlichen, aber gerade platzt mein Kopf.
Code:
import java.awt.Dimension;
import java.awt.event.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.nio.charset.*;
import java.nio.file.*;

import javax.swing.*;


public class Oberflaeche extends JFrame {
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    JTextField tfBearbeiter;
    JTextField tfAktenzeichen;
    JTextField tfDelikt;

    JLabel lblBearbeiter;
    JLabel lblAktenzeichen;
    JLabel lblDelikt;
    JLabel done;

    JButton btnFallErstellen;
    JButton btnDokErstellen;
   
   
    public static void main(String[] args) {


                Oberflaeche oberflaeche = new Oberflaeche();
                oberflaeche.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                oberflaeche.setSize(new Dimension(400, 400));
                oberflaeche.setVisible(true);
               
               
               
    }
   
   
   

    public Oberflaeche() {
        super("Fall Manager");
        this.getContentPane().setLayout(null);
        this.initWindow();
       

    }

    protected void initWindow() {

        getBtnErstellen();
        getBtn2Erstellen();

        getContentBearbeiter();
        getContentAktenzeichen();
        getContentDelikt();
        getContentDone();


    }
   
   
    private void getContentDone(){
       
        done = new JLabel("Fall erstellt");
        done.setBounds(5,200,250,50);
          this.getContentPane().add(done);
        done.setVisible(false);
    }

    private void getContentBearbeiter() {
        lblBearbeiter = new JLabel("Bearbeiter:");
        lblBearbeiter.setBounds(5, 10, 170, 30);
        this.getContentPane().add(lblBearbeiter);

        tfBearbeiter = new JTextField();
        tfBearbeiter.setBounds(180, 10, 170, 30);
        this.getContentPane().add(tfBearbeiter);
    }

    private void getContentAktenzeichen() {
        lblAktenzeichen = new JLabel("Aktenzeichen:");
        lblAktenzeichen.setBounds(5, 50, 170, 30);
        this.getContentPane().add(lblAktenzeichen);

        tfAktenzeichen = new JTextField();
        tfAktenzeichen.setBounds(180, 50, 170, 30);
        this.getContentPane().add(tfAktenzeichen);
    }

    private void getContentDelikt() {
        lblDelikt = new JLabel("Delikt:");
        lblDelikt.setBounds(5, 90, 170, 30);
        this.getContentPane().add(lblDelikt);

        tfDelikt = new JTextField();
        tfDelikt.setBounds(180, 90, 170, 30);
        this.getContentPane().add(tfDelikt);
    }

    private void getBtnErstellen() {
        btnFallErstellen = new JButton("Fall erstellen");
        btnFallErstellen.setBounds(5, 130, 150, 20);
        this.getContentPane().add(btnFallErstellen);
       

        btnFallErstellen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                try {
                    String defaultPath = getDefaultPath();
                    createOutputDirectory(defaultPath);
                    writeDataToFile(defaultPath);
                   
                    done.setVisible(true);
        
                   
                  
            
                    }
                   
                 catch (IOException e) {
                    e.printStackTrace();
                }
              
            }
        });
    }
   
   
  
    private void getBtn2Erstellen() {
        btnDokErstellen = new JButton("Dokument hinzufügen");
        btnDokErstellen.setBounds(175, 130, 170, 20);
        this.getContentPane().add(btnDokErstellen);
       
   
       

        btnDokErstellen.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
            
                new Oberflaeche2(this);
               
           
               
            }
        });
       
      
   
    }
  
    protected String getDefaultPath() {

        return "file:/I:/eclipse/Fälle/";
    }
  

    protected void createOutputDirectory(String defaultPath) throws IOException {

        Files.createDirectories(getOutputPath(defaultPath));
    }

    private void writeDataToFile(String defaultPath) throws IOException {

        BufferedWriter writer = Files.newBufferedWriter(getFilePath(defaultPath), StandardCharsets.UTF_16LE);

        writer.write(lblBearbeiter.getText().concat(tfBearbeiter.getText()));
        writer.write(System.lineSeparator());
        writer.write(lblDelikt.getText().concat(tfDelikt.getText()));

        writer.flush();
        writer.close();

    }

    private Path getFilePath(String defaultPath) {

        String fileName = String.valueOf(System.currentTimeMillis()).concat(".txt");
        Path filePath = Paths.get("");
        try {
            filePath = Paths.get(getOutputPath(defaultPath).toString() + File.separator + "Allgemein" + fileName);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return filePath;

    }

    private Path getOutputPath(String defaultPath) throws IOException {
        Path dirPath = Paths.get(URI.create(defaultPath.concat(tfAktenzeichen.getText())));
        return dirPath;
    }
   
       
}

Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JList;


public class Oberflaeche2 extends JDialog {

    /**
     *
     */
    private static final long serialVersionUID = 1L;
   
    private JPanel contentPane;
    private JTextField textField;
    private JTextField textField_1;
    private JComboBox comboBox;

    /**
     * Launch the application.
     */
   

    /**
     * Create the frame.
     */
    public Oberflaeche2(ActionListener actionListener) {
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
       
       
        JLabel lblName = new JLabel("Name des Dokuments\r\n");
        lblName.setBounds(22, 83, 148, 17);
        contentPane.add(lblName);
       
        textField = new JTextField();
        textField.setBounds(199, 83, 86, 20);
        contentPane.add(textField);
        textField.setColumns(10);
       
        JButton btnDokumentErstellen = new JButton("Dokument erstellen");
        btnDokumentErstellen.setBounds(137, 228, 138, 23);
        contentPane.add(btnDokumentErstellen);
       
       
        comboBox = new JComboBox();
        comboBox.setBounds(199, 41, 180, 17);
        contentPane.add(comboBox);
       
        for(File i: einlesen())
        {
            comboBox.addItem(i);
        }
       
        JLabel lblAktenzeichenAuswhlen = new JLabel("Aktenzeichen ausw\u00E4hlen");
        lblAktenzeichenAuswhlen.setBounds(22, 41, 148, 17);
        contentPane.add(lblAktenzeichenAuswhlen);
       
        JLabel lblInhalt = new JLabel("Inhalt");
        lblInhalt.setBounds(79, 127, 46, 14);
        contentPane.add(lblInhalt);
       
        textField_1 = new JTextField();
        textField_1.setBounds(139, 124, 215, 93);
        contentPane.add(textField_1);
        textField_1.setColumns(10);
       
        setVisible(true);
   
       
   
   
    btnDokumentErstellen.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
            try {
                URI defaultPath1 = getDefaultPath1();
                writeDataToFile(defaultPath1);
            } catch (IOException e) {
                e.printStackTrace();
            }
            setVisible(false);
        }
    });

   
   
}
   
public void open() {
   
        this.setVisible(true);
    }

public File[] einlesen()
{
    File f = new File("I:/eclipse/Fälle/");
    File[] fileArray = f.listFiles();
    return fileArray;
}

protected URI getDefaultPath1() {

    return ((File)comboBox.getSelectedItem()).toURI();
}

private void writeDataToFile(URI defaultPath1) throws IOException {

    BufferedWriter writer = Files.newBufferedWriter(Paths.get(new URI(defaultPath1.toString() +  textField.getText() + ".txt")), StandardCharsets.UTF_16LE);

    writer.write(textField_1.getText());

    writer.flush();
    writer.close();

}

private Path getFilePath1(String defaultPath1) throws IOException {

    String fileName = String.valueOf(".txt");
    Path filePath = Paths.get("");
    filePath = Paths.get(getOutputPath1(defaultPath1).toString() + File.separator + textField.getText() + fileName);
    return filePath;


}

private Path getOutputPath1(String defaultPath1) throws IOException {
    Path dirPath = Paths.get(URI.create("file:/" + defaultPath1));
    return dirPath;
}
}

Vielleicht hat ja einer mal kurz Zeit drüberzuschauen.

Liebe Grüße
 
Ok, bin da ^^
Also... zunächst mal wärs ganz schön wenn du die Benennung von Klassen / Feldern / Methoden so machst, dass man beim hinschauen als außenstehender weiß, um was es dabei im einzelnen geht.

Als nächstes ist dein Konstruktor vieeeeeel zu lang 😉 Lager das doch bitte aus in eigene Methoden.

Wenn du deinen Code übersichtlich hältst, dann findest du auch Fehler wesentlich schneller, und andere Leute können sich leichter reinlesen.

Ein positiver Nebeneffekt ist natürlich auch, dass dir nicht so leicht der Kopf platzt.
 
Ps: Bearbeiten kannst du scheinbar nur eine gewisse Zeit nach Erstellen des Beitrags.


Ok, bin da ^^
Also... zunächst mal wärs ganz schön wenn du die Benennung von Klassen / Feldern / Methoden so machst, dass man beim hinschauen als außenstehender weiß, um was es dabei im einzelnen geht.

Als nächstes ist dein Konstruktor vieeeeeel zu lang 😉 Lager das doch bitte aus in eigene Methoden.

Wenn du deinen Code übersichtlich hältst, dann findest du auch Fehler wesentlich schneller, und andere Leute können sich leichter reinlesen.

Ein positiver Nebeneffekt ist natürlich auch, dass dir nicht so leicht der Kopf platzt.

Nun zum Eigentlichen Thema was an dem Code falsch ist (außer den Schönheitsfehlern):
Warum übergibst du dem Konstruktor von Oberfläche2 einen Actionlistener? Zumal du den gar nicht benutzt.
Es ist eigentlich nicht nötig den Text eines Labels mit "\r\n" zu beenden, siehe:
Java:
JLabel lblName = new JLabel("Name des Dokuments\r\n");

Du landest in einer Nullpointer Exception in irgendnem Event. Das liegt daran, dass du beim Laden des FileArrays was falsch machst. Das solltest du entweder abfangen, oder von vornherein verhindern.

Habe deine Methode einlesen umgeschrieben, sieht jetzt so aus:
Java:
    public void einlesen(String directoryName, ArrayList placeholder) {
        File directory = new File(directoryName.replaceFirst("file:/", ""));

        // get all the files from a directory
        File[] fList = directory.listFiles();
        for (File file : fList) {
            if (file.isFile()) {
                files.add(file);
            } else if (file.isDirectory()) {
                einlesen(file.getAbsolutePath(), files);
            }
        }
    }

Placeholder ist ein Feld von Oberflaeche2, welches im Konstruktor initialisiert wird.
der directoryName wird jetzt anstatt deinem ActionListener an den Konstruktor übergeben wird.
Im Moment such ich alle Files im directory, und geh dann durch alle subdirectories durch, da ich keine Ahnung hab was du genau suchst 😀

Vielleicht hilft Dir das so vorerst weiter.
 

Neue Themen


Zurück
Oben