Datenbankanbindung

Ci

Aktives Mitglied
Hallo,

hab ne GUI Klasse in der ich zwei Buttons implementiert habe. mit dem Button prüfung abschließen möchte ich meine Variablen Inhalte in eine Access Datenbank laden.

aber irgendwie funktioniert das nicht!
nach dem ich auf den Button prüfung abschließen geklickt hab, bringt mir der Compiler folgende Fehlermeldungen:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at getATR.GUI_ATR$2.actionPerformed(GUI_ATR.java:156)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

blick da irgendwie nicht mehr durch :(

ach ja, hier noch mein Code:

Java:
package getATR;

import java.awt.EventQueue;

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

public class MainKlasse {

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
			try {
				GUI_ATR frame = new GUI_ATR();
				frame.setVisible(true);

				// -------- Datenanbindung --------- //
				
                    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

                    Connection con = DriverManager
                    .getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)}"
                            + ";DBQ=C:/Dokumente und Einstellungen/xyz/Desktop/"
                            + "Datenbank_Test.mdb");
                 
				
                    	} catch (Exception e) {
                    			e.printStackTrace();
                    	}
			
				}
	
			});
				
		}
}

Java:
package getATR;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import javax.smartcardio.CardException;
import javax.swing.*;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

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

public class GUI_ATR extends JFrame{
	
	// Meine Button 
	public static JButton daten_pruefen = new JButton("<html>Daten<br>pruefen</html>");
	public static JButton pruefung_abschließen = new JButton("<html>Pruefung<br>abschliessen</html>");
	
	public static JLabel lblKartennr = new JLabel("* Karten-Nr.:");
	public static JFormattedTextField txtFKartennr = new JFormattedTextField();
	
	// das hier ist neu:
	public static String blabla = null;
	
	public static String b = "346";
	public static String c = "456";

	private Connection con;
	
	public static JTextArea textArea = new JTextArea();
	private final JScrollPane scrollPane = new JScrollPane();
	
	static File f;
	static String path_f;
	static int returnVal;
	
	
	public GUI_ATR() {
		
		setTitle("TEST");
		
		this.setVisible(true);
		setSize(1010, 532);
		setLocation(150, 100);
		setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
		JPanel panel = new JPanel();
		getContentPane().add(panel);
		panel.setLayout(null);
		
		// Daten prüfen Button
		
		panel.add(daten_pruefen);
		daten_pruefen.setSize(70, 35);
		daten_pruefen.setLocation(5, 5);
	
		// Prüfung abschließen Button
		
		panel.add(pruefung_abschließen);
		pruefung_abschließen.setSize(95, 35);
		pruefung_abschließen.setLocation(350, 5);

		// Karten-Nr.:
		lblKartennr.setBounds(458, 259, 81, 14);
		panel.add(lblKartennr);
		lblKartennr.setVisible(false);
		
		txtFKartennr.setBounds(579, 256, 100, 20);
		panel.add(txtFKartennr);
		txtFKartennr.setDocument(new FixedSizeDocument(6));
		txtFKartennr.setVisible(false);
		
		// Text Area
		
		scrollPane.setBounds(5, 45, 440, 455);
		panel.add(scrollPane);
		scrollPane.setViewportView(textArea);
		
		addWindowListener(new meinWindowListener());

		
	/////////////////////////////////////////////////
	// Daten prüfen Button
	/////////////////////////////////////////////////
	
	
	daten_pruefen.addActionListener(new ActionListener(){
	public void actionPerformed(ActionEvent e) {
		open_terminal();
		karteninhalt_auslesen.init_log_command_list();
		if (e.getSource() == daten_pruefen) {
			gui_leeren();
			open_terminal();
			if (Connect_Terminal.isTerminal_present() == true) {
				open_card();
				if (Connect_Card.isCard_present() == true) {
					
					lblKartennr.setVisible(true);
					txtFKartennr.setVisible(true);
					String inhalt = txtFKartennr.getText();
					System.out.println(inhalt);
					init_osVersion();
					try {
						
						//Karteninhalt ausgeben
						karteninhalt_auslesen.ausgabe_auswahl();
					
					} catch (CardException e1) {
						e1.printStackTrace();
					}
					
				} else {
					GUI_ATR.textArea.append("Keine Karte vorhanden");
					
				}
			} else {
				GUI_ATR.textArea.append("Chipkartenleser ist nicht eingesteckt");
			}
		}
	}
	});
		
		/////////////////////////////////////////////////
		// Prüfung abschließen Button
		/////////////////////////////////////////////////
		
		pruefung_abschließen.addActionListener(new ActionListener(){
		public void actionPerformed(ActionEvent e) {
		if (e.getSource() == pruefung_abschließen) {
			
			open_terminal();

			blabla = txtFKartennr.getText();
			System.out.println("Hier der Inhalt: " +blabla );
			
			gui_leeren();
			
			GUI_ATR.textArea.append("...Formular geleert!");
			
			try {
                
				con.createStatement().executeUpdate("INSERT INTO Tabelle1 (ATC,Chipkartennummer,Kurz_BLZ) VALUES ('" + blabla + "','" + b + "','" + c + "') ");
				con.close();
                       } catch (SQLException sqle) {
                            sqle.printStackTrace();
                       }
                   
			}
	
		}
		});
	}
	
	public void gui_leeren(){
		
		// um mein Textfeld zu leeren
		textArea.setText("");
		lblKartennr.setVisible(false);					
		txtFKartennr.setVisible(false);
		txtFKartennr.setText("");
	}
	
	public static void init_osVersion() {
		Inhalt_ATR.init_ATR();
		Inhalt_ATR.convert_atr();
		Inhalt_ATR.init_all_Maps();
		Inhalt_ATR.set_all_Variables();
	}
	

	public static void open_terminal() {
		Connect_Terminal.create_factory();
		try {
			Connect_Terminal.create_terminals(0);
		} catch (CardException e2) {
			textArea.append(e2.toString());
		} catch (Exception e2) {
			textArea.append(e2.toString());
		}
	}

	public static void open_card() {
		try {
			Connect_Card.newCard();
		} catch (CardException e1) {
			GUI_ATR.textArea.append(e1.toString());
		}
	}

	public static void File_chooser() throws IOException {
		JFileChooser fc = new JFileChooser();
		fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		returnVal = fc.showOpenDialog(null);

		if (returnVal == JFileChooser.APPROVE_OPTION) {
			setF(fc.getSelectedFile());
			setPath_f(f.getPath());
		}
	}

	public static File getF() {
		return f;
	}

	public static void setF(File f) {
		GUI_ATR.f = f;
	}

	public static String getPath_f() {
		return path_f;
	}

	public static void setPath_f(String path_f) {
		GUI_ATR.path_f = path_f;
	}


	public class meinWindowListener extends WindowAdapter {
		public void windowClosing(WindowEvent a) {
			System.exit(0);
		}
	}
}
	
/*
 * extra Klasse, um in den Eingabefelder in der Manuellen Eingabe die Länge zu kontrollieren
 * Bsp.: im Feld Kartennummer sollen nur die ersten sechs Ziffern eingegeben werden
 */
class FixedSizeDocument extends PlainDocument {
    private int max = 6;

    public FixedSizeDocument(int max) {
            this.max = max;
    }

    public void insertString(int offs, String str, AttributeSet attr)
                    throws BadLocationException {

            if (str != null) {
                    if (isInt(str) == true) {
                            if (getLength() + str.length() > max) {

                                    str = str.substring(0, max - getLength());
                            }
                            super.insertString(offs, str, attr);
                    }
            }
    }

    public boolean isInt(String s) {
            try {
                    Integer.parseInt(s);
                    return true;
            } catch (Exception e) {
                    return false;
            }
    }
}

gruß
 
Zuletzt bearbeitet:

hartzie

Aktives Mitglied
Der Code ist natürlich leicht unübersichtlich und viel.

Aber ich würde mal sagen, dass du einmal in deiner Main Methode eine Connection aufbaust, diese aber nicht durchreichst zu deiner GUI_ATTR Klasse. Dort verwendest du dann eine Connection con die beim schnellen überblicken nicht initialisiert wird.

Versuch mal zu schauen ob es daran liegt.
 

Ci

Aktives Mitglied
Die Variable blabla bekommt in der GUI im Textfeld irgendeinen Wert. Dieser Wert soll dann in die Datenbank!

grad die Zeile befindet sich da drin:

Java:
con.createStatement().executeUpdate("INSERT INTO Tabelle1 (ATC,Chipkartennummer,Kurz_BLZ) VALUES ('" + blabla + "','" + b + "','" + c + "') ");

blabla hab ich ja weiter oben im Code mit null deklariert!
 
Zuletzt bearbeitet:

Michael...

Top Contributor
at getATR.GUI_ATR$2.actionPerformed(GUI_ATR.java:156)
Eine Variable auf die in Zeile 156 der Klasse GUI_ATR zugeriffen wird ist nicht initialisiert.
Wenn ich das richtig sehe handelt es sich dabei um
Code:
Connection con
. Weder wird diese Variable direkt in der Klasse noch durch eine set-Methode von aussen initialisiert.

Und ich werde auch nicht müde Dir den Hinweis zu geben, dass die Überprüfungen
Code:
e.getSource()==...
in den anonym erzeugten und direkt zugewiesenen ActionListenern überflüssig ist ;-)
 

hartzie

Aktives Mitglied
Als Lösung könntest du die Connection aus der Main Methode in den Konstruktor deiner GUI Klasse übergeben und deiner lokalen Connection zuweisen. Damit sollte das Problem behoben sein.
 

Ci

Aktives Mitglied
du meinst die Datenbankanbindung komplett aus der Main raus nehmen?! oder wie meinst du das genau?

ach ja Michael, hab die Zeile
Code:
e.getSource()==...
jetzt rausgenommen ;)
 

hartzie

Aktives Mitglied
Das kannst du machen wie du willst. Entweder du übergibst ihm deine Connection con aus der Main dem Konstruktor GUI_ATTR oder du packst die ganze Verbindungsaufbausache direkt in die Klasse GUI_ATTR.
 

Ci

Aktives Mitglied
habs jetzt so probiert, aber da kann ich schon nicht mehr die GUI starten :(

Java:
package getATR;

import ....
...

public class GUI_ATR extends JFrame{
	
	// Meine Button 
	public static JButton daten_pruefen = new JButton("<html>Daten<br>pruefen</html>");
	public static JButton pruefung_abschließen = new JButton("<html>Pruefung<br>abschliessen</html>");
	
	public static JLabel lblKartennr = new JLabel("* Karten-Nr.:");
	public static JFormattedTextField txtFKartennr = new JFormattedTextField();
	
	// das hier ist neu:
	public static String blabla = null;
	
	public static String b = "346";
	public static String c = "456";

	private Connection con;
	
	public static JTextArea textArea = new JTextArea();
	private final JScrollPane scrollPane = new JScrollPane();
	
	static File f;
	static String path_f;
	static int returnVal;
	
	
	public GUI_ATR() {
		
// --------- Was ich davon in meiner MainKlasse hatt -----------//
		
		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		
        Connection con = DriverManager
        .getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)}"
           + ";DBQ=C:/Dokumente und Einstellungen/xyz/Desktop/"
           + "Datenbank_Test.mdb");
		
//----------------------------------------------------------------------------//

		setTitle("TEST");
		
		this.setVisible(true);
		setSize(1010, 532);
		setLocation(150, 100);
		setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
		JPanel panel = new JPanel();
		getContentPane().add(panel);
		panel.setLayout(null);
		
		// Daten prüfen Button
		
		panel.add(daten_pruefen);
		daten_pruefen.setSize(70, 35);
		daten_pruefen.setLocation(5, 5);
	
		// Prüfung abschließen Button
		
		panel.add(pruefung_abschließen);
		pruefung_abschließen.setSize(95, 35);
		pruefung_abschließen.setLocation(350, 5);

		// Karten-Nr.:
		lblKartennr.setBounds(458, 259, 81, 14);
		panel.add(lblKartennr);
		lblKartennr.setVisible(false);
		
		txtFKartennr.setBounds(579, 256, 100, 20);
		panel.add(txtFKartennr);
		txtFKartennr.setDocument(new FixedSizeDocument(6));
		txtFKartennr.setVisible(false);
		
		// Text Area
		
		scrollPane.setBounds(5, 45, 440, 455);
		panel.add(scrollPane);
		scrollPane.setViewportView(textArea);
		
		addWindowListener(new meinWindowListener());

		
	/////////////////////////////////////////////////
	// Daten prüfen Button
	/////////////////////////////////////////////////
	
	
	daten_pruefen.addActionListener(new ActionListener(){
	public void actionPerformed(ActionEvent e) {
		open_terminal();
		karteninhalt_auslesen.init_log_command_list();
			gui_leeren();
			open_terminal();
			if (Connect_Terminal.isTerminal_present() == true) {
				open_card();
				if (Connect_Card.isCard_present() == true) {
					
					lblKartennr.setVisible(true);
					txtFKartennr.setVisible(true);
					String inhalt = txtFKartennr.getText();
					System.out.println(inhalt);
					init_osVersion();
					try {
						
						//Karteninhalt ausgeben
						karteninhalt_auslesen.ausgabe_auswahl();
					
					} catch (CardException e1) {
						e1.printStackTrace();
					}
					
				} else {
					GUI_ATR.textArea.append("Keine Karte vorhanden");
					
				}
			} else {
				GUI_ATR.textArea.append("Chipkartenleser ist nicht eingesteckt");
			}
		}
	});
		
		/////////////////////////////////////////////////
		// Prüfung abschließen Button
		/////////////////////////////////////////////////
		
		pruefung_abschließen.addActionListener(new ActionListener(){
		public void actionPerformed(ActionEvent e) {
		
			
			open_terminal();

			blabla = txtFKartennr.getText();
			System.out.println("Hier der Inhalt: " +blabla );
			
			gui_leeren();
			
			GUI_ATR.textArea.append("...Formular geleert!");
			
			try {
				
				con.createStatement().executeUpdate("INSERT INTO Tabelle1 (ATC,Chipkartennummer,Kurz_BLZ) VALUES ('" + blabla + "','" + b + "','" + c + "') ");
                       } catch (SQLException sqle) {
                            sqle.printStackTrace();
                       }
                   con.close();
			}
	
		
		});
	}
	
	public void gui_leeren(){
		
		// um mein Textfeld zu leeren
		textArea.setText("");
		lblKartennr.setVisible(false);					
		txtFKartennr.setVisible(false);
		txtFKartennr.setText("");
	}
	
	public static void init_osVersion() {
		Inhalt_ATR.init_ATR();
		Inhalt_ATR.convert_atr();
		Inhalt_ATR.init_all_Maps();
		Inhalt_ATR.set_all_Variables();
	}
	

	public static void open_terminal() {
		Connect_Terminal.create_factory();
		try {
			Connect_Terminal.create_terminals(0);
		} catch (CardException e2) {
			textArea.append(e2.toString());
		} catch (Exception e2) {
			textArea.append(e2.toString());
		}
	}

	public static void open_card() {
		try {
			Connect_Card.newCard();
		} catch (CardException e1) {
			GUI_ATR.textArea.append(e1.toString());
		}
	}

	public static void File_chooser() throws IOException {
		JFileChooser fc = new JFileChooser();
		fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		returnVal = fc.showOpenDialog(null);

		if (returnVal == JFileChooser.APPROVE_OPTION) {
			setF(fc.getSelectedFile());
			setPath_f(f.getPath());
		}
	}

	public static File getF() {
		return f;
	}

	public static void setF(File f) {
		GUI_ATR.f = f;
	}

	public static String getPath_f() {
		return path_f;
	}

	public static void setPath_f(String path_f) {
		GUI_ATR.path_f = path_f;
	}


	public class meinWindowListener extends WindowAdapter {
		public void windowClosing(WindowEvent a) {
			System.exit(0);
		}
	}
}
 

hartzie

Aktives Mitglied
Heilige scheisse sry aber weisst du was du überhaupt tust? Überleg doch mal lieber was du tun willst und schleuder nicht einfach Code durch die Gegend.
Und die GUI startet nicht ist keine gute Aussage. Was passiert denn wenn du versuchst das Programm zu starten?
 

Ci

Aktives Mitglied
na ja, ich bekomm die Fehlermeldungen hier, sobald ich das Programm starte:

Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problems:
Cannot refer to a non-final variable con inside an inner class defined in a different method
Cannot refer to a non-final variable con inside an inner class defined in a different method

wegen dem Abschnitt meckert der Compiler unzwar in den Zeilen mit den
Code:
con. ...
:

Java:
try {
				
				con.createStatement().executeUpdate("INSERT INTO Tabelle1 (ATC,Chipkartennummer,Kurz_BLZ) VALUES ('" + blabla + "','" + b + "','" + c + "') ");
                       } catch (SQLException sqle) {
                            sqle.printStackTrace();
                       }
                       con.close();
                  
			}
 
Zuletzt bearbeitet:

Ci

Aktives Mitglied
Das kannst du machen wie du willst. Entweder du übergibst ihm deine Connection con aus der Main dem Konstruktor GUI_ATTR oder du packst die ganze Verbindungsaufbausache direkt in die Klasse GUI_ATTR.

Die ganze Verbindungsaufbausache soll nur dann geschehen, wenn ich auf den Button Prüfung abschließen geklickt hab.

Wie bekomm ich das hin?
 
Ähnliche Java Themen

Ähnliche Java Themen


Oben