Java-Programm. Probleme bei der Umsetzung von einer Kontaktverwaltung.

TH260199

Neues Mitglied
Mein Ziel ist es eine Kontaktverwaltung aufzubauen und soweit so gut habe ich es schon grob geschafft.
Der Inhalt soll in einer Datenbank und CSV-Datei gespeichert werden.
Die Eingabe soll über Swings durch Eingabemasken erfolgen. Ich habe drei Texteingaben und eine Zahleingabe.
Komischerweise wird aber die Texteingabe nicht übernommen und bei der Zahleingabe kommt nur die 10.
Ich lade den Code mal hoch.
Ich würde mich über Hilfe wirklich freuen, das ist nur ein Projekt zum üben.
Ich fange gerade erst mit dem Programmieren an.

Java:
package kontaktVerwaltung;

import java.awt.Checkbox;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.swing.JOptionPane;

 class db {
    
       public void speichern() {
          kontaktVerwaltungClass cw = new kontaktVerwaltungClass();
          
           String url = "jdbc:mysql://localhost:3306/verwaltung";
            String user = "root";
            String pass = "";
            
                try {
              
                Connection con = DriverManager.getConnection(url, user, pass);
              
                String sql = "insert into contact(name, adress, postcode, website) values(?,?,?,?)";
                   PreparedStatement pstmt = con.prepareStatement(sql);
                   pstmt.setString(1, cw.tfName.getText());
                   pstmt.setString(2, cw.tfAdress.getText());
                   pstmt.setInt(3, cw.tfPostcode.getColumns());
                   pstmt.setString(4, cw.tfWebsite.getText());
                   pstmt.execute();

                  
                   con.close();
                } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, e.getMessage());

                }
                
            
          
        }
      
       public void show() {
          
       }
        

 }



Code:
package kontaktVerwaltung;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

class csv {
    
    
    
    public void save() {
        
        kontaktVerwaltungClass cv = new kontaktVerwaltungClass();
        
        try (PrintWriter writer = new PrintWriter(new File("test.csv"))) {

            StringBuilder sb = new StringBuilder();
            sb.append("Name");
            sb.append(',');
            sb.append("Adresse");
            sb.append(',');
            sb.append("Postleitzahl");
            sb.append(",");
            sb.append("Webseite");
            sb.append('\n');

            sb.append(cv.tfName.getText());
            sb.append(',');
            sb.append(cv.tfAdress.getText());
            sb.append(',');
            sb.append(cv.tfPostcode.getColumns());
            sb.append(',');
            sb.append(cv.tfWebsite.getText());
            sb.append('\n');

            writer.write(sb.toString());
            writer.close();
            System.out.println("done!");

        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        }

    }
        
    
}
 
Dann zeige doch auch mal die Klasse kontaktVerwaltungClass.

Was ich vermute:
A) Du öffnest das Fenster in Zeile 16 aber es geht sofort weiter. Der Anwender hat also keine Zeit, etwas einzugeben.
B) getColumns sieht dubios aus. Was für ein Control soll da eine Eingabe zurück geben?

Der Ablauf bei einer UI Anwendung ist Eventbasiert. Es gibt also eine UI und wenn der Nutzer etwas macht, dann passiert etwas. Dann kann das save aufgerufen werden, aber dem Save muss natürlich übergeben werden, was gespeichert werden soll.
 
Dann zeige doch auch mal die Klasse kontaktVerwaltungClass.

Was ich vermute:
A) Du öffnest das Fenster in Zeile 16 aber es geht sofort weiter. Der Anwender hat also keine Zeit, etwas einzugeben.
B) getColumns sieht dubios aus. Was für ein Control soll da eine Eingabe zurück geben?

Der Ablauf bei einer UI Anwendung ist Eventbasiert. Es gibt also eine UI und wenn der Nutzer etwas macht, dann passiert etwas. Dann kann das save aufgerufen werden, aber dem Save muss natürlich übergeben werden, was gespeichert werden soll.
Da habe ich eigentlich nur ein Objekt erzeugt und dann im CLick_Event die DB und die Datei ablaufen lassen.
getColumn soll eigentlich nur den eingetragenen Wert abspeichern.

Java:
package kontaktVerwaltung;

import java.awt.Color;

import java.awt.EventQueue;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.Toolkit;
import java.awt.Label;
import javax.swing.JMenuBar;
import javax.swing.UIManager;
import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JList;
import java.awt.Component;
import javax.swing.Box;
import java.awt.Dimension;
import javax.swing.JTable;


public class kontaktVerwaltungClass extends JFrame {
    

    
    public JPanel contentPane;
    public JTextField tfName;
    public JTextField tfAdress;
    public JTextField tfPostcode;
    public JTextField tfWebsite;
    private JTable table;

    

    

    

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    kontaktVerwaltungClass frame = new kontaktVerwaltungClass();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public kontaktVerwaltungClass() {
        setTitle("Kontaktverwaltung");
        setForeground(UIManager.getColor("FormattedTextField.selectionForeground"));
        setBackground(new Color(255, 255, 128));
        setIconImage(Toolkit.getDefaultToolkit().getImage("C:\\Users\\tomha\\Desktop\\kisspng-computer-icons-google-contacts-iphone-simple-png-contact-5ab06b07ce0bb5.436415021521511175844.png"));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 806, 469);
        contentPane = new JPanel();
        contentPane.setBackground(UIManager.getColor("InternalFrame.activeTitleGradient"));
        
        

        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        JLabel picturbeLabel = new JLabel("New label");
        picturbeLabel.setIcon(new ImageIcon("C:\\Users\\tomha\\Desktop\\Firmenlogo.png"));
        picturbeLabel.setBounds(568, 21, 200, 131);
        contentPane.add(picturbeLabel);
        
        JLabel lblName = new JLabel("Name: ");
        lblName.setFont(new Font("Times New Roman", Font.PLAIN, 14));
        lblName.setBounds(10, 21, 45, 13);
        contentPane.add(lblName);
        
        JLabel lblAdress = new JLabel("Strasse & Nr: ");
        lblAdress.setFont(new Font("Tahoma", Font.PLAIN, 14));
        lblAdress.setBounds(10, 44, 114, 13);
        contentPane.add(lblAdress);
        
        JLabel lblPostcode = new JLabel("PLZ & Ort: ");
        lblPostcode.setFont(new Font("Tahoma", Font.PLAIN, 14));
        lblPostcode.setBounds(10, 65, 90, 13);
        contentPane.add(lblPostcode);
        
        JLabel lblWebsite = new JLabel("Webseite: ");
        lblWebsite.setFont(new Font("Tahoma", Font.PLAIN, 14));
        lblWebsite.setBounds(10, 89, 90, 13);
        contentPane.add(lblWebsite);
        
        tfName = new JTextField();
        tfName.setBounds(90, 19, 174, 19);
        contentPane.add(tfName);
        tfName.setColumns(10);
        
        tfAdress = new JTextField();
        tfAdress.setBounds(90, 43, 174, 19);
        contentPane.add(tfAdress);
        tfAdress.setColumns(10);
        
        tfPostcode = new JTextField();
        tfPostcode.setBounds(90, 64, 174, 19);
        contentPane.add(tfPostcode);
        tfPostcode.setColumns(10);
        
        tfWebsite = new JTextField();
        tfWebsite.setBounds(90, 88, 174, 19);
        contentPane.add(tfWebsite);
        tfWebsite.setColumns(10);
        
        JButton btnAdd = new JButton("Kontakt hinzufügen");
        btnAdd.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                
                db database = new db();
                csv data = new csv();
                
                database.speichern();
                data.save();
            }
        });
        btnAdd.setFont(new Font("Tahoma", Font.PLAIN, 16));
        btnAdd.setActionCommand("Kontakt hinzufügen");
        btnAdd.setBounds(274, 78, 174, 34);
        contentPane.add(btnAdd);
        
        table = new JTable();
        table.setBounds(61, 175, 628, 220);
        contentPane.add(table);
                
    }
}
 
wie schon gesagt wurde getColumns()) gibt dir die Spalten Nummer nicht den Text den du eingegen hast.

Das Objekt was du in der Zeile 15 der db Klasse erstellt. Ist nicht das selbe was du in der main Methode erstellst hast. Du musst die Ref an die db Klasse übergehen wenn du von ihr aus die Eingaben in der GUI zugreifen willst. Nicht ein neues Objekt erstellen.
 
Java:
                db database = new db(); // hier solltes du die ref von dir selber übergeben
                csv data = new csv();   // und in einer Instanzvariablen  Variablen speichern
                                        // zum weiterverwenden. damit hat deine db Klasse eine ref auf
                                        // die GUI
 
Mehrere Probleme (in etwa das, was ich schon erwähnt habe):

Du hast eine Instanz der Klasse kontaktVerwaltungClass - diese wirst Du vermutlich in Deiner main Methode erzeugen und anzeigen. Beim Drücken auf den Knopf rufst Du dann die gezeigte Methode auf. Diese erzeugt dann eine neue Instanz von kontaktVerwaltungClass. Damit hast Du zwei Instanzen. In einer sind die Eingaben und die zweite ist einfach leer - die wurde nur erzeugt und nie angezeigt.

Erster schneller Fix (noch nicht schön): Übergib die Instanz, also:
Java:
    public void save(kontaktVerwaltungClass cv) {
        
        try (PrintWriter writer = new PrintWriter(new File("test.csv"))) {
        // ...

Und der Aufruf erfolgt dann in etwa so: data.save(this);

Der zweite Punkt ist der Aufruf von getColumn. Du hast ein Textfeld und kannst da nur den Text abfragen. Das wäre getText. In der csv Datei sollte das schon ausreichen. In der Datenbank-Variante brauchst du den int Wert - den kannst Du per Integer.parseInt bekommen.

Generell ist das so aber noch nicht wirklich schön. Die Klassen für die Datenbank / CSV Datei sollten keine Abhängigkeit zu der UI haben. Es wäre also besser, das nur Abhängig zu machen zu den Daten selbst. Du solltest also die Werte als Parameter übergeben. Entweder als einzelne Parameter oder - was üblich ist - über eine Klasse. Du erstellst also eine Klasse Kontakt und dann hast Du eine Methode save (Kontakt kontakt)

Das wären so ein paar einfache Ideen zu dieser Problematik.

Und dann noch der Hinweis zu den Conding Guidelines, die bei Java in der Regel eingehalten werden: Klassennamen fangen mit einem großen Buchstaben an. Und Bezeichner sollten immer gut ausdrücken, was sich dahinter verbirgt. Das ist also eine Klasse die ein Kontakt Eingabe Fenster darstellt ... also wäre sowas wie KontaktEingabeFenster sinnvoll (so die Namen auf Deutsch sein sollen).
 
Java:
class Csv {
    private KontaktVerwaltungClass cv;
    public Csv(KontaktVerwaltungClass cv) {
        this.cv = cv;
    }

    public void save() {
        try (PrintWriter writer = new PrintWriter(new File("test.csv"))) {
        ....
     
//------------------------------------    
class Db {
    private  KontaktVerwaltungClass cw;
    public Db(KontaktVerwaltungClass cw) {
        this.cw = cw;
    }
    public void speichern() {
        String url = "jdbc:mysql://localhost:3306/verwaltung";
        String user = "root";
        ....
//-----------------------------------
// KontaktVerwaltungClass
....
     @Override
            public void mouseClicked(MouseEvent e) {

                Db database = new Db(KontaktVerwaltungClass.this); //Die Objekte könnte man auch schon früher erstellen. als Istanzvariable.
                Csv data = new Csv(KontaktVerwaltungClass.this);

                database.speichern();
                data.save();
            }

....

so solltest du zugrif auf deine GUI haben.
 
Zuletzt bearbeitet:
Erster schneller Fix (noch nicht schön): Übergib die Instanz, also:
Java:
Code:
    public void save(kontaktVerwaltungClass cv) {
       
        try (PrintWriter writer = new PrintWriter(new File("test.csv"))) {
        // ...

Und der Aufruf erfolgt dann in etwa so: data.save(this);
Hierbei solltest du bedenken das du in einer Callback Methode (Listener) bist. Schaue wie du da an das richtige „this“ kommst.
 

Neue Themen


Zurück
Oben