Auf ein Objekt zurgreifen

Snickers0815

Mitglied
Hallo Leute,

ich habe folgendes Problem und stehe gerade auf dem Schlauch:

Zur kurzen Übersicht ich programmiere derzeit ein Anmeldevorgang mit Datenbankbezug. Jetzt möchte ich wenn sich ein User anmeldet, mir alle Daten von dem User aus der DB ziehen und ein neues UserObjekt mit den Daten aus der DB anlegen. Mein Problem ist, wenn ich jetzt von einer anderen Klasse versuche auf die Daten von meinem eingeloggten User zuzugreifen funktioniert dies nicht. Wahrscheinlich ein dummer Fehler..

Programmausschnitte:

Klasse UserLogin

initKundenObject(rs.getInt("KundenNR"), rs.getInt("PLZ"), rs.getString("Straße"), rs.getString("Stadt"), rs.getString("Vorname"), rs.getString("Nachname"), rs.getString("Username")); /*Hier hole ich mir die Daten aus der DB*/
****
private void initKundenObject(int kundenNR, int plz, String straße, String stadt, String vorname, String nachname, String username) {
kunde = new kunde(kundenNR, plz, straße, stadt, vorname, nachname);
kunde.setUsername(username);
}

Klasse KundenKontoinformation

username = kunde.getUsername();

Ich hoffe mein Problem kommt verständlich rüber.

Gruß,
Snickers
 
Mein Problem ist, wenn ich jetzt von einer anderen Klasse versuche auf die Daten von meinem eingeloggten User zuzugreifen funktioniert dies nicht.
Was bedeutet: "funktioniert nicht"? Fliegt eine Exception? Wenn ja bitte Stacktrace + relevanten Code posten 🙂

username = kunde.getUsername();
Wie initialisierst du kunde?

PS:
Nächstes mal Code bitte in [code=Java]MY CODE[/code] posten

Gruß Robert 🙂
 
Keine Exception, Username ist einfach leer. Habe auch getestet ob die Daten von der DB richtig übernommen werden, dass werden sie.

So habe ich Kunde in der Klasse KundenKontoinformation initalisiert:
Java:
private kunde kunde = new kunde();

Gruß Snickers 🙂
 
Hab ich mir fast gedacht 😉

Der Grund warum dein Code nicht funktioniert ist folgender:

Du erstellst in deiner initKunde() Methode ein neues Kunden-Objekt und übergibst ihm die Daten. Damit hast du ein Objekt wo deine Daten korrekt drin stehen.
Nun erstellst du in der anderen Klasse ein neues Objekt [mit new kunde() ]. Damit sind aber auch die Daten neu d.h. es enthält nicht die Daten aus deinem ersten Kunden-Objekt.

Beispiel:
Java:
Kunde paul = new Kunde();
paul.setName("Paul");

Kunde marie = new Kunde();
marie.setName("Marie");

Selbes Beispiel wie bei dir. Du erstellst 2 Objekte - diese haben aber nicht den selben Inhalt 🙂

Gibt jetzt mehrere Möglichkeiten dein Objekt in deine KundenKontoinformation zu übergeben.
Mögliche Wegen wären über Getter / Setter, Methode in der UserLogin Klasse (deine init - Methode) die das User-Objekt zurückgibt, ..

Gruß Robert 🙂
 
Also sollte es funktionieren, wenn ich in meiner KundenKontoinformation folgendes ändere:
Java:
 private kunde kunde;

und dann mit getter den Username mir hole?
Java:
username = kunde.getUsername();



Gruß Snickers
 
Nein das wird dir eine NullPointerException (NPE) liefern, da du versuchst eine Methode auf eine Null-Referenz aufzurufen 🙂

Ich kenne - wie bereits gesagt - deine Projekt - und Klassenstruktur nicht aber eine Möglichkeit wäre es die Methode initUser() (die sicherlich in einer DB-Verwaltungsklasse liegt ?? ) public zu machen und als Return-Typ eine User-Instanz festzulegen. In deiner KundenKontoinformation Klasse kannst du dann eine Instanz deiner DB Klasse erstellen und dein User mittels Kunde kunde = db.initUser(...) initialisieren.

Minimalbeispiel:
Java:
public class Database
{
     public Database() {}

     public Kunde getKundeByName(String name)
     {  
                // ... Daten des Kunden mit dem übergebenen namen holen 
                alter = rs.get(..);
                strasse = rs.get(..);
                return new Kunde(name, alter, strasse);
     }   
}

public class KundenKontoInformation
{
     private Kunde kunde;
     private Database db;

     public KundenKontoInformation()
     {
           this.db = new Database();
           this.kunde = db.getKundeByName("Paul");
           String username = kunde.getUsername();
     }
}

PS: Solltest du es nicht hinbekommen dann schreib mal bitte deine Projektstruktur auf damit hier Lich ins dunkle kommt 😛
 
Hier mal meine zwei Klassen: (da ich mit GUI arbeite sind sie etwas länger, denke mal das macht dir abr nis as 😀 )

Java:
package ui;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import Core.*;
import com.mysql.jdbc.PreparedStatement;
import ui.Mitarbeiter.*;
import ui.Kunde.*;
import ui.Filialleiter.*;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;
import java.awt.event.ActionEvent;
import javax.swing.JPasswordField;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JCheckBox;
import javax.swing.JRadioButton;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.ButtonGroup;

public class UserLogin extends JFrame {

   private JPanel contentPane;
   private JTextField textFieldUsername;
   private JPasswordField passwordFieldPassword;
   private ButtonGroup bg = new ButtonGroup();
   private KundenMenue km = new KundenMenue();
   private FilialleiterMenue fm = new FilialleiterMenue();
   private MitarbeiterMenue mm = new MitarbeiterMenue();
   private KundenKontoinformation kki = new KundenKontoinformation();
   private Connection con = null;
   private kunde kunde = new kunde();
  
   /**
    * Launch the application.
    */
   public static void main(String[] args) {
       EventQueue.invokeLater(new Runnable() {
           public void run() {
               try {
                   UserLogin frame = new UserLogin();
                   frame.setVisible(true);
               } catch (Exception e) {
                   e.printStackTrace();
               }
           }
       });
   }

   /**
    * Create the frame.
    */
   public UserLogin() {
      
       //Verbindung zur DB
       con = connection.dbConnection();

       setTitle("Login");
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setBounds(100, 100, 450, 300);
       contentPane = new JPanel();
       contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
       setContentPane(contentPane);
       contentPane.setLayout(null);

       JLabel lblUsername = new JLabel("Username");
       lblUsername.setBounds(40, 45, 68, 14);
       contentPane.add(lblUsername);

       JLabel lblPassword = new JLabel("Password");
       lblPassword.setBounds(40, 110, 68, 14);
       contentPane.add(lblPassword);

       textFieldUsername = new JTextField();
       textFieldUsername.setBounds(118, 42, 86, 20);
       contentPane.add(textFieldUsername);
       textFieldUsername.setColumns(10);

       passwordFieldPassword = new JPasswordField();
       passwordFieldPassword.setBounds(118, 107, 86, 20);
       contentPane.add(passwordFieldPassword);

       JRadioButton rdbtnFilialleiter = new JRadioButton("Filialleiter");
       rdbtnFilialleiter.setBounds(273, 45, 109, 23);
       contentPane.add(rdbtnFilialleiter);
       bg.add(rdbtnFilialleiter);

       JRadioButton rdbtnMitarbeiter = new JRadioButton("Mitarbeiter");
       rdbtnMitarbeiter.setBounds(273, 90, 109, 23);
       contentPane.add(rdbtnMitarbeiter);
       bg.add(rdbtnMitarbeiter);

       JRadioButton rdbtnKunde = new JRadioButton("Kunde");
       rdbtnKunde.setBounds(273, 135, 109, 23);
       contentPane.add(rdbtnKunde);
       bg.add(rdbtnKunde);

       JButton btnLogin = new JButton("Login");
       btnLogin.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent arg0) {

               try {

                   String name = textFieldUsername.getText();
                   String pwd = passwordFieldPassword.getText();

                   if (rdbtnFilialleiter.isSelected()) {
                       String query = "select * from filialleiter where username=? and password=?";
                       PreparedStatement statement = (PreparedStatement) con.prepareStatement(query);
                       statement.setString(1, name);
                       statement.setString(2, pwd);

                       ResultSet rs = statement.executeQuery();
                       if (rs.next()) {

                           JOptionPane.showMessageDialog(null, "Login successful");

                           fm.setVisible(true);
                           setVisible(false);
                       } else {

                           JOptionPane.showMessageDialog(null, "Invalid Username or Password");
                       }
                   } else if (rdbtnMitarbeiter.isSelected()) {
                       String query = "select * from ansprechpartner where username=? and password=?";
                       PreparedStatement statement = (PreparedStatement) con.prepareStatement(query);
                       statement.setString(1, name);
                       statement.setString(2, pwd);

                       ResultSet rs = statement.executeQuery();
                       if (rs.next()) {

                           JOptionPane.showMessageDialog(null, "Login successful");

                           mm.setVisible(true);
                           setVisible(false);
                       } else {

                           JOptionPane.showMessageDialog(null, "Invalid Username or Password");
                       }
                   } else if (rdbtnKunde.isSelected()) {
                       String query = "select * from kunde where username=? and password=?";
                       PreparedStatement statement = (PreparedStatement) con.prepareStatement(query);
                       statement.setString(1, name);
                       statement.setString(2, pwd);

                       ResultSet rs = statement.executeQuery();
                       if (rs.next()) {
                                                      
                           initKundenObject(rs.getInt("KundenNR"), rs.getInt("PLZ"), rs.getString("Straße"), rs.getString("Stadt"), rs.getString("Vorname"), rs.getString("Nachname"), rs.getString("Username")); //hier übergeb ich die Daten aus meiner DB der Methode
                          
                           JOptionPane.showMessageDialog(null, "Login successful");

                           km.setVisible(true);
                           setVisible(false);

                       } else {

                           JOptionPane.showMessageDialog(null, "Invalid Username or Password");
                       }
                   } else {
                       JOptionPane.showMessageDialog(null, "Please select one option");
                   }

               } catch (SQLException e) {

                   e.printStackTrace();
               }
           }
       });
       btnLogin.setBounds(118, 188, 89, 23);
       contentPane.add(btnLogin);

   }
  
   /**
     * User Objekt erstellen
     *
     */
  
    private void initKundenObject(int kundenNR, int plz, String straße, String stadt, String vorname, String nachname, String username) {
        kunde = new kunde(kundenNR, plz, straße, stadt, vorname, nachname);
        kunde.setUsername(username);
          }
}

Java:
package ui.Kunde;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import com.mysql.jdbc.PreparedStatement;
import ui.*;
import ui.connection;
import Core.*;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JTextPane;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class KundenKontoinformation extends JFrame {

   private JPanel contentPane;
   private JComboBox comboBoxKonto;
   private String username;
   private JLabel lblKontonr;
   private JTextField textFieldKontoNR;
   private JLabel lblKontostand;
   private JTextField textFieldKontostand;
   private JLabel lblZinssatz;
   private JTextField textFieldZinssatz;
   private JLabel lblLaufzeitende;
   private JTextField textFieldLaufzeitende;
   private JButton btnZurck;
   private Connection con = null;
   private kunde kunde;
   // private KundenMenue km = new KundenMenue();

   public String getUsername() {
       return this.username;
   }

   public void setUsername(String username) {
       this.username = username;
   }

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

   public void fillComboBox() {

       try {
           con = connection.dbConnection();
           username = kunde.getUsername();//Versuch den Usernamen des derzeit eingeloggten Users zu holen
           String query = "select * from kunde where username=?";
           PreparedStatement statement = (PreparedStatement) con.prepareStatement(query);
           statement.setString(1, username);
           ResultSet rs = statement.executeQuery();

           while (rs.next()) {
               if (rs.getBoolean("Sparkonto")) {
                   comboBoxKonto.addItem("Sparkonto");
               } else if (rs.getBoolean("Girokonto")) {
                   comboBoxKonto.addItem("Girokonto");
               } else if (rs.getBoolean("Festgeldkonto")) {
                   comboBoxKonto.addItem("Festgeldkonto");
               } else {
                   JOptionPane.showMessageDialog(null, "Kein Konto vorhanden");
               }

               JOptionPane.showMessageDialog(null, rs.getString("Vorname") + ", " + rs.getString("Nachname"));

           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }

   /**
    * Create the frame.
    */
   public KundenKontoinformation() {
      
       // Verbindung zur DB
       con = connection.dbConnection();
              
       setTitle("Kontoinformation");
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setBounds(100, 100, 450, 300);
       contentPane = new JPanel();
       contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
       setContentPane(contentPane);
       contentPane.setLayout(null);

       comboBoxKonto = new JComboBox();
       comboBoxKonto.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent arg0) {
               try {
                   String ausgewaehlteskonto = (String) comboBoxKonto.getSelectedItem();
                   String query = "select * from ?";
                   PreparedStatement statement = (PreparedStatement) con.prepareStatement(query);
                   statement.setString(1, ausgewaehlteskonto);
                   ResultSet rs = statement.executeQuery();

                   while (rs.next()) {

                       if (ausgewaehlteskonto.equals("Sparkonto")) {
                           textFieldKontoNR.setText(rs.getString("KontoNR"));
                           textFieldKontostand.setText(rs.getString("Kontostand"));
                           textFieldZinssatz.setText(rs.getString("Zinssatz"));
                           textFieldLaufzeitende.setEnabled(false);
                       } else if (ausgewaehlteskonto.equals("Girokonto")) {
                           textFieldKontoNR.setText(rs.getString("KontoNR"));
                           textFieldKontostand.setText(rs.getString("Kontostand"));
                           textFieldZinssatz.setEnabled(false);
                           textFieldLaufzeitende.setEnabled(false);
                       } else {
                           textFieldKontoNR.setText(rs.getString("KontoNR"));
                           textFieldKontostand.setText(rs.getString("Kontostand"));
                           textFieldZinssatz.setText(rs.getString("Zinssatz"));
                           textFieldLaufzeitende.setText(rs.getString("Ende"));
                       }

                   }
               } catch (Exception e) {
                   e.printStackTrace();
               }

           }
       });
       comboBoxKonto.setBounds(166, 11, 164, 20);
       contentPane.add(comboBoxKonto);

       JLabel lblKontoAuswhlen = new JLabel("Konto ausw\u00E4hlen:");
       lblKontoAuswhlen.setBounds(30, 14, 126, 14);
       contentPane.add(lblKontoAuswhlen);

       lblKontonr = new JLabel("KontoNR:");
       lblKontonr.setBounds(30, 92, 84, 14);
       contentPane.add(lblKontonr);

       textFieldKontoNR = new JTextField();
       textFieldKontoNR.setBounds(124, 89, 206, 20);
       contentPane.add(textFieldKontoNR);
       textFieldKontoNR.setColumns(10);

       lblKontostand = new JLabel("Kontostand:");
       lblKontostand.setBounds(30, 117, 84, 14);
       contentPane.add(lblKontostand);

       textFieldKontostand = new JTextField();
       textFieldKontostand.setBounds(124, 114, 206, 20);
       contentPane.add(textFieldKontostand);
       textFieldKontostand.setColumns(10);

       lblZinssatz = new JLabel("Zinssatz:");
       lblZinssatz.setBounds(30, 142, 84, 14);
       contentPane.add(lblZinssatz);

       textFieldZinssatz = new JTextField();
       textFieldZinssatz.setBounds(124, 139, 206, 20);
       contentPane.add(textFieldZinssatz);
       textFieldZinssatz.setColumns(10);

       lblLaufzeitende = new JLabel("Laufzeitende:");
       lblLaufzeitende.setBounds(30, 167, 84, 14);
       contentPane.add(lblLaufzeitende);

       textFieldLaufzeitende = new JTextField();
       textFieldLaufzeitende.setBounds(124, 164, 206, 20);
       contentPane.add(textFieldLaufzeitende);
       textFieldLaufzeitende.setColumns(10);

       btnZurck = new JButton("Zur\u00FCck");
       // btnZurck.addActionListener(new ActionListener() {
       // public void actionPerformed(ActionEvent arg0) {
       //
       // km.setVisible(true);
       // setVisible(false);
       // }
       // });
       btnZurck.setBounds(335, 228, 89, 23);
       contentPane.add(btnZurck);

       fillComboBox();
   }
}
 
Zuletzt bearbeitet von einem Moderator:
Ich wollte noch ein Bild von meinem Projekt mit Packages hochladen, da gab es aber einen Error 😀

Deshalb versuche ich es mal so aufzuschreiben (Ausschnitt):

Projekt: Schulprojekt

  • Package: Core
    • Klasse: kunde
  • Package: ui
    • Klasse: UserLogin
  • Package: ui.Kunde
    • Klasse: KundenKontoinformation
 
Ich habe jetzt folgendes versucht, bringt mir aber wieder eine NPE.

Klasse LoginUser

Java:
kki.setKunde(initKundenObject(rs.getInt("KundenNR"), rs.getInt("PLZ"), rs.getString("Straße"), rs.getString("Stadt"), rs.getString("Vorname"), rs.getString("Nachname"), rs.getString("Username")));

 public kunde initKundenObject(int kundenNR, int plz, String straße, String stadt, String vorname, String nachname, String username) {
        kunde = new kunde(kundenNR, plz, straße, stadt, vorname, nachname);
        kunde.setUsername(username);
        return kunde;
    }

Klasse Kundenkontoinformation

Java:
public void setKunde(kunde kunde){
       this.kunde = kunde;
   }

username = kunde.getUsername();

Habe gedacht, so könnte ich das erzeugte Kunden Objekt übergeben, aber ist wohl kein Unterschied zu vorher... :/
 
So wie du es gerade probiert hast ist grundsätzlich schon richtig. Das Problem ist aber dass du den Usernamen abfragen willst bevor du den Kunden setzt!
Warum? Weil deine Methode fillComboBox vom Konstruktor der Klasse KundenKontoInformation aufgerufen wird.
In deiner Klasse UserLogin instanzierst du ein KundenKontoInformation Objekt (somit wird "fillComboBox" aufgerufen bevor du einen Kunden setzt).

Mögliche Lösung: Du setzt den Kunden über den Konstruktor der Klasse KundenKontoInformation, dann darfst du diese Klasse aber erst instanzieren wenn du sie brauchst und einen entsprechenden Kunden übergeben kannst.
 
Heißt das ich muss meinen Code wie folgt abändern?

Klasse LoginUser

Java:
private Kundenkontoinformation kki;

.....
kki = new kki(initKundenObject(rs.getInt("KundenNR"), rs.getInt("PLZ"), rs.getString("Straße"), rs.getString("Stadt"), rs.getString("Vorname"), rs.getString("Nachname"), rs.getString("Username")));
.....

Klasse Kundenkontoinformation

Java:
public KundenKontoinformation (kunde kunde){

   this.kunde = kunde;
   .
   .
   .
}
 
Da ich meinen Konsturktor geändert habe bekomme ich jetzt in meiner Main Methode einen Fehler (The constructor KundenKontoinformation() is undefined).

Jetzt wollte ich meinen Konstruktoraufruf wie folgt abändern:

Java:
public static void main(String[] args) {
       EventQueue.invokeLater(new Runnable() {
           public void run() {
               try {
                   KundenKontoinformation frame = new KundenKontoinformation(kunde);
                   frame.setVisible(true);
               } catch (Exception e) {
                   e.printStackTrace();
               }
           }
       });
   }

bekomme aber folgende Fehlermeldung: Cannot make a static reference to the non-static field kunde.

Muss ich jetzt einfach nur mein

Java:
private kunde kunde;  -> private static kunde kunde;

ändern?
Ich habe mir bestimmt schon hundertmal durchgelesen was static macht, aber nie richtig verstanden. Beeinflusst das mein kunden Objekt irgendwie?
 
Wozu brauchst du diese main Methode? Um ein die Klasse "KundenKontoInformation" zu testen?
Wenn es nur zum testen der Klasse ist dann erstellt lokal in der main-Methode eine Dummy Kunden Objekt mit von dir gewählten Werten.

Nein das Attribut statisch zu machen ist falsch. So würde jede Instanz der Klasse "KundenKontoInformation" auf das selbe Kundenobjekt zugreifen.
 
Alles klar ich kann die Main Methode weglassen. 😀

Vielen Dank schon mal für eure Hilfe bisher!!!

Jetzt habe ich noch eine Frage: Ich habe noch weitere Klassen (KundenMenue und KundenUeberweisung), wo ich ein Objekt der Klasse Kundenkontoinformation anlege. Habe diese wie folgt inizialisiert:

Java:
private kunde kunde = new kunde();
   private KundenKontoinformation kontoinformation = new KundenKontoinformation(kunde);

Ist das so richtig? Habe mein Programm getestet und es scheint den Usernamen jetzt richtig zu übernehmen. Bin mir nur nicht ganz sicher, weil ich einen neuen Error bekomme, der in meinen Augen aber durch was anderes ausgelöst wird (leider weiß ich nicht wirklich wodurch).

Hier mal mein neuer Error:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''Sparkonto'' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2617)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2834)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2156)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2313)
at ui.Kunde.KundenKontoinformation$1.actionPerformed(KundenKontoinformation.java:124)
at javax.swing.JComboBox.fireActionEvent(Unknown Source)
at javax.swing.JComboBox.contentsChanged(Unknown Source)
at javax.swing.AbstractListModel.fireContentsChanged(Unknown Source)
at javax.swing.DefaultComboBoxModel.setSelectedItem(Unknown Source)
at javax.swing.DefaultComboBoxModel.addElement(Unknown Source)
at javax.swing.JComboBox.addItem(Unknown Source)
at ui.Kunde.KundenKontoinformation.fillComboBox(KundenKontoinformation.java:81)
at ui.Kunde.KundenKontoinformation.<init>(KundenKontoinformation.java:206)
at ui.UserLogin$2.actionPerformed(UserLogin.java:162)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Der Fehler müsste sich auf meine Klasse Kundenkontoinformation beziehen. Laut der Beschreibung muss ja ein Fehler bei der Syntax von Sparkonto sein. Jedoch kann ich da nichts falsches erkennen...

Gruß Snickers
 
Dein Fehler scheint hier drin zu sein In der actionPerformed):
Code:
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2313)
at ui.Kunde.KundenKontoinformation$1.actionPerformed(KundenKontoinformation.java:124)
und zwar in dem sql-Statement das da aufgebaut wird. Und in dem sql-Statement kommt wohl ein Tabellennamen oder Spaltennamen "Sparkonto" vor.
 
Ich finde keinen Fehler in meiner SQL Syntax. Der Fehler müsste sich auf folgenden Teil beziehen:

Java:
comboBoxKonto = new JComboBox();
       comboBoxKonto.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent arg0) {
               try {
                   String ausgewaehlteskonto = (String) comboBoxKonto.getSelectedItem();
                   String query = "select * from ?";
                   PreparedStatement statement = (PreparedStatement) con.prepareStatement(query);
                   statement.setString(1, ausgewaehlteskonto);
                   ResultSet rs = statement.executeQuery();

                   while (rs.next()) {

                       if (ausgewaehlteskonto.equals("Sparkonto")) {
                           textFieldKontoNR.setText(rs.getString("KontoNR"));
                           textFieldKontostand.setText(rs.getString("Kontostand"));
                           textFieldZinssatz.setText(rs.getString("Zinssatz"));
                           textFieldLaufzeitende.setEnabled(false);
                       } else if (ausgewaehlteskonto.equals("Girokonto")) {
                           textFieldKontoNR.setText(rs.getString("KontoNR"));
                           textFieldKontostand.setText(rs.getString("Kontostand"));
                           textFieldZinssatz.setEnabled(false);
                           textFieldLaufzeitende.setEnabled(false);
                       } else if(ausgewaehlteskonto.equals("Festgeldkonto")){
                           textFieldKontoNR.setText(rs.getString("KontoNR"));
                           textFieldKontostand.setText(rs.getString("Kontostand"));
                           textFieldZinssatz.setText(rs.getString("Zinssatz"));
                           textFieldLaufzeitende.setText(rs.getString("Ende"));
                       }else{
                           JOptionPane.showMessageDialog(null, "Bitte ein Konto auswählen");
                       }

                   }
               } catch (Exception e) {
                   e.printStackTrace();
               }

           }
       });

Vielleicht bin ich nur blind und einer von euch sieht den Fehler auf anhieb. Ich habe auch noch einmal überprüft ob ich Sparkonto richtig geschrieben habe. Das habe ich. In meiner DB ist Sparkonto auch genauso geschrieben und wenn ich den SQL Befehl (select * from Sparkonto) ausführe wird mir auch alles ganz normal ausgegeben.

Gruß Snickers
 
Wo hast du denn die Info her, dass du den Platzhalter auf diese Weise verwenden darfst? Du benutzt PreparedStatement hier schlicht falsch...
Salopp: Die Parameter sind nur für Spalten-Werte, nicht für Tabellennamen oder sonst was.
 
Ich glaube Claus braucht noch einen Kaffee 🙂🙂 Aber hast du dir das mal angeschaut was da genau von deiner Combo-Box zurückkommt ? Sind da aus versehen noch andere Zeichen drin als nur "Sparkonto"?
Codiere das Statement doch mal hart als select * from Sparkonto und guck ob es dann geht
 
Sorry. Habe mir das alles mehr oder weniger mithilfe von tutorials etc. selbst beigebracht. Da meine Lehrer in der Schule keine wirkliche Hilfe sind.

Wollte es jetzt so lösen:

Java:
kundenNR = kunde.getKundenNR();
                   String ausgewaehlteskonto = (String) comboBoxKonto.getSelectedItem();
                   String query = "select * from "+ausgewaehlteskonto+" where KundenNR="+kundenNR;
                   PreparedStatement statement = (PreparedStatement) con.prepareStatement(query);

Meine ComboBox ist jedoch leer. Habe ich bei der Methode auch die PreparedStatements falsch benutzt?

Java:
    public void fillComboBox() {

       try {
           con = connection.dbConnection();
           username = kunde.getUsername();
           String query = "select * from kunde where username=?";
           PreparedStatement statement = (PreparedStatement) con.prepareStatement(query);
           statement.setString(1, username);
           ResultSet rs = statement.executeQuery();

           while (rs.next()) {
               if (rs.getBoolean("Sparkonto")) {
                   comboBoxKonto.addItem("Sparkonto");
               } else if (rs.getBoolean("Girokonto")) {
                   comboBoxKonto.addItem("Girokonto");
               } else if (rs.getBoolean("Festgeldkonto")) {
                   comboBoxKonto.addItem("Festgeldkonto");
               } else {
                   JOptionPane.showMessageDialog(null, "Kein Konto vorhanden");
               }

               JOptionPane.showMessageDialog(null, rs.getString("Vorname") + ", " + rs.getString("Nachname"));//Zum testen ob der Username richtig übergeben wird

           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }



Vielen Dank an dieser Stelle schon mal für euere Hifle und Geduld bei so Fragen/Problemen.
 
Ich glaube Claus braucht noch einen Kaffee 🙂🙂

Nein brauche ich nicht 😉

Code:
if (ausgewaehlteskonto.equals("Sparkonto"))........
                       }else{
                           JOptionPane.showMessageDialog(null, "Bitte ein Konto auswählen");
                       }

Klar war das etwas provokant aber laut der If Abfrage kann ausgewaehlteskonto wohl auch vollkommen undefinierte Werte annehmen. Was dann zu jedem beliebigen Query führen klann.

Gruß

Claus
 
Wo hast du denn die Info her, dass du den Platzhalter auf diese Weise verwenden darfst? Du benutzt PreparedStatement hier schlicht falsch...
Salopp: Die Parameter sind nur für Spalten-Werte, nicht für Tabellennamen oder sonst was.

Ist das echt so? Habe das noch nie ausprobiert aber macht doch eigentlich keinen Sinn da preparedStatement doch im Prinzip nur ein paar StringReplaces machen sollte oder nicht?

Gruß

Claus
 
Kann es sein das meine ComboBox nicht mit Items gefüllt wird, weil ich .addItem() benutze und ein String übergebe?

Java:
if (rs.getBoolean("Sparkonto")) {
                   comboBoxKonto.addItem("Sparkonto");

Meine if Abfrage müsste doch stimmen oder? In meiner DB ist Sparkonto als boolean in meiner Tabelle Kunde angelegt.
 
Ich habe es getestet. Meine if Abfragen liefern alle die richtigen Ergebnisse. Meiner ComboBox wird aber kein neues Item hinzugefügt.

Kann ich meiner ComboBox nicht mit der Methode .addItem() ein neues Item hinzufügen?
 
da preparedStatement doch im Prinzip nur ein paar StringReplaces machen sollte oder nicht?

Nein, Prepared Statement sind viel mehr als das. Es werden Statements (samt eventueller Platzhalter) an das DBMS übergeben, dort vorab optimiert usw. Im Grunde alles, was mit normalen Querys auch geschieht, nur werden sie nicht ausgeführt. Die Statements liegen anschließend vorübersetzt im DBMS vor und müssen dort nur noch mit Werten gefüllt und ausgeführt werden. Übersichtlicherer Code beim Client und das Vermeiden von SQL Injections sind eigentlich nicht mehr als ein angenehmer Nebeneffekt.
 
Ich habe es getestet. Meine if Abfragen liefern alle die richtigen Ergebnisse. Meiner ComboBox wird aber kein neues Item hinzugefügt.

Kann ich meiner ComboBox nicht mit der Methode .addItem() ein neues Item hinzufügen?

Du hast ein Verhalten, dass du nicht erklären kannst und weißt vom Weg von der Datenhaltung her hin zur Darstellung nicht, wo du nach dem Fehler suchen sollst. Was sagt dir das über die Struktur deines Codes?
 

Zurück
Oben