Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich möchte gerne eine JComboBox mit einer SQL Ergebnis (Resultset) füllen.
Ich möchte in der ersten Dropbox die Tabelle Fach auslesen (nur Name) dann soll man in der Vorlesung Dropbox die zugehörigen Fächer auslesen. Die Datenbank is so realisiert:
Eine Tabelle Fach, Vorlesung, Kombi FV (Für Fach + Vorlesung) Es gibt pro Fach mehrere Vorlesungen.
Habt Ihr eine Idee. Meine GUI steht schon. Kann den Code gerne auf Anfrage posten.
es wäre sehr nett wenn mir jemand sobald wie möglich antworten könnte.
Es geht hier um ein Uni Projekt, ich würde hier auch nix posten wenn ich nicht selbst schon gesucht hätte.
was soll man zu so einer allgemeinen Frage sagen?
irgendwo besteht ein Programm aus Code, dort lädst du Daten aus der DB und schreibst sie in die Comboboxen, genau so wie benötigt,
fertig, brachte dich dieser Satz weiter?
wenn du dazu Detailfragen hast musst du sie stellen, es sind hundert Dinge zu beachten, allein alles zu Datenbanken, alles zur GUI, das ganze zusammenführen, sicherlich zig bis hunderte Zeilen Code und Stunden Arbeit,
aber da kann man keine generellen Tipps geben, außer nach Möglichkeit alles separat zu testen,
die DB-Abfragen in einem Konsolen-Programm ohne sich mit der GUI zu belasten,
die GUI-Vorgänge erstmal mit Dummy-Daten durchspielen, ohne gleichzeitig am SQL zu hadern,
wenn alle Einzelteile funktionieren, dann zusammenbringen
es ist nicht ganz klar, ob bei der Auswahl in einer Box noch weitere spezielle DB-Abfragen ausgeführt und Ergebnisse in andere Strukturen geschrieben werden, wenn ja dann ist das an sich auch ein normaler Vorgang:
an die erste JComboBox gehört ein Listener, der reagiert auf die Auswahl eines Faches mit einer Datenbankabfrage und schreibt die Ergebnisse wohin auch immer
Ich habe es mir so gedacht. Ich habe die ComboBox Fach, diese soll mit dem Ergebnis folgender SQL Abfrage gefüllt werden:
SELECT Name FROM Fach
Nun soll der Benutzer in der ComboBox ein Fach auswählen und zu dem entsprechenden Fach die Vorlesungen ausgeben.
Somit muss man ein SQL Befehl abhängig von dem ausgewählten ausführen um in der ComboBox Vorlesung die entsprechenden Vorlesungen anzuzeigen.
Der SQL Befehl würde eventuell so lauten:
SELECT Name FROM KombiFV WHERE ID= Auwahl (Auwahl = das ausgewählte Fach --> ID)
Hoffe das war jetzt spezifischer.
Den Listener für die ComboBox brauch ich ja um das selected Item auszulesen, das kann ich ja dann in die zweite SQL Abfrage einbinden als Variable.
BZH vorher noch herausfinden welche ID hinter dem ausgewählten Fach steht.
du kannst entweder am Anfang die Ids zu den Fächern merken, per Map oder gleich richtiges Fach-Objekt statt nur String in Combobox,
oder später die SQL-Query so bauen dass sie mit dem Fach-Namen auskommt, der ja hoffentlich ausreicht, Join über Fach-Tabelle
[c]select * from KombiFV k, Fach f where k.id = f.id and f.name = ?[/c]
wie du überhaupt ein Info, ob Name oder Id, in eine SQL-Abfrage rein bekommst, ist nicht deine Frage, oder?
zu empfehlen ist gleich PreparedStatement
Ok das mit dem prepared Statement hatte ich auch vor. Jetzt ist eher meine Frage wie mache ich das, wenn ich ein Fach auswähle in der ComboBox Fach soll er dann in der ComboBox Vorlesung die entsprechenden Vorlesungen zu dem Fach laden. Wie kann ich sowas programmieren. Muss ich das über selectedItem machen. Er soll mir das ja dynamisch laden oder?
Also nochmal so als Grundinfo.
Das ganze ist ein Verwaltungsprogramm.
EIn Professor wird von einem Administrator angelegt und einem Fachbereich zugeordnet. (Teil1)
Der prof kann nun nach einem Login(Teil2) ein Fach erstellen(Teil3).
Zu dem Fach dann mehrere Vorlesungen.(Teil4)
Zu den Vorlesungen Fragen+Antworten .(Teil5)
Es ist etwas kompliziert aber ich weiß ja im prinzip wie ich es mache auch mit den Abfragen ich häng halt nur an dem Füllen der ComboBoxen die ja abhängig voneinander sind.
Hoffe ich konnte es einigermaßen verständlich beschreiben.
Ok dankeschön kann es zwar jetzt nicht wirklich so übernehmen. Ich poste dir hier mal grade meinen Code könntest du mir dann sagen wo ich was reinmachen muss. Das wäre echt nett.
Danke für die Mühe.
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTextField;
import com.cloudgarden.layout.AnchorConstraint;
import com.cloudgarden.layout.AnchorLayout;
public class FA_einegeben extends JFrame {
//Variablen Deklaration
JComboBox Fach;
JComboBox Vorlesung;
JTextField A_1;
JTextField A_2;
JTextField A_3;
JTextField A_4;
JTextField Frage_Eingabe;
JButton Speicher_exit;
JButton Speichern;
public FA_einegeben() {
//Fenster Informationen
setTitle("*Fragen und Antworten eingeben*");
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setVisible(true);
try {
//AnchorLayout für variable Fenstereinstellung der Komponenten
AnchorLayout thisLayout = new AnchorLayout();
getContentPane().setLayout(thisLayout);
{
//Auswahl Fach
ComboBoxModel FachModel =
new DefaultComboBoxModel(
new String[] { "Fach" });
Fach = new JComboBox();
getContentPane().add(Fach, new AnchorConstraint(1, 502, 103, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
Fach.setModel(FachModel);
Fach.setPreferredSize(new java.awt.Dimension(209, 35));
Fach.addItemListener( new ItemListener() {
public void itemStateChanged( ItemEvent e ) {
JComboBox selectedChoice = (JComboBox)e.getSource();
if ( selectedChoice.getSelectedItem().equals("Ende") )
System.exit( 0 );
}
} );
}
{
//Auswahl Vorlesung
ComboBoxModel VorlesungModel =
new DefaultComboBoxModel(
new String[] { "Vorlesung" });
Vorlesung = new JComboBox();
getContentPane().add(Vorlesung, new AnchorConstraint(1, 973, 103, 502, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
Vorlesung.setModel(VorlesungModel);
Vorlesung.setPreferredSize(new java.awt.Dimension(208, 35));
Vorlesung.addItemListener( new ItemListener() {
public void itemStateChanged( ItemEvent e ) {
JComboBox selectedChoice = (JComboBox)e.getSource();
if ( selectedChoice.getSelectedItem().equals("Ende") )
System.exit( 0 );
}
} );
}
{
//Fragen Eingabe
Frage_Eingabe = new JTextField();
getContentPane().add(Frage_Eingabe, new AnchorConstraint(158, 500, 236, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
Frage_Eingabe.setText("Bitte geben Sie eine Frage ein");
Frage_Eingabe.setPreferredSize(new java.awt.Dimension(208, 27));
}
{
//Antwort 1
A_1 = new JTextField();
getContentPane().add(A_1, new AnchorConstraint(283, 200, 364, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
A_1.setText("Antwort 1");
A_1.setPreferredSize(new java.awt.Dimension(76, 28));
}
{
//Antwort 2
A_2 = new JTextField();
getContentPane().add(A_2, new AnchorConstraint(399, 200, 481, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
A_2.setText("Antwort 2");
A_2.setPreferredSize(new java.awt.Dimension(76, 28));
}
{
//Antwort 3
A_3 = new JTextField();
getContentPane().add(A_3, new AnchorConstraint(515, 200, 594, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
A_3.setText("Antwort 3");
A_3.setPreferredSize(new java.awt.Dimension(76, 27));
}
{
//Antwort 4
A_4 = new JTextField();
getContentPane().add(A_4, new AnchorConstraint(629, 200, 707, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
A_4.setText("Antwort 4");
A_4.setPreferredSize(new java.awt.Dimension(76, 27));
}
{
//Speichern in die Datenbank
Speichern = new JButton();
getContentPane().add(Speichern, new AnchorConstraint(783, 212, 861, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
Speichern.setText("Speichern");
Speichern.setPreferredSize(new java.awt.Dimension(81, 27));
Speichern.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DB.Fragen.Einfügen();
DB.Antwort.Einfügen();
//Funktion für IDs erstellen? (mit SELECT von Tabellen)
DB.KombiFA.Einfügen();
}
});
}
{
//Speichern in die Datenbank und Fenster schließen
Speicher_exit = new JButton();
getContentPane().add(Speicher_exit, new AnchorConstraint(783, 651, 861, 236, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
Speicher_exit.setText("Speichern und schließen");
Speicher_exit.setPreferredSize(new java.awt.Dimension(183, 27));
Speicher_exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DB.Fragen.Einfügen();
DB.Antwort.Einfügen();
//Funktion für IDs erstellen? (mit SELECT von Tabellen)
DB.KombiFA.Einfügen();
System.exit(EXIT_ON_CLOSE);
}
});
}
{
this.setSize(451, 374);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
Das ist jetzt ein Beispiel wo der Dozent Fragen und Antworten zu einer ausgewählten Vorlesung abhängig vom Fach eingeben kann.
Wegen dem Füllen der ComboBox: Ich hatte mir auch mal so etwas ähnliches erstellt, und da ich das an mehreren Stellen brauchte, hab ich mir eine eigene Klasse abgeleitet von JComboBox geschrieben. (Kannst du aber auch direkt in die Klasse schreiben, wo du die ComboBox brauchst.) In dieser Klasse wird eine Liste mit den entsprechenden Objekten (in meinem Beispiel Institut) von der Datenbank geholt und über ein DefaultComboBoxModel in die ComboBox hinzugefügt. In der toString-Methode der Objekte kannst du dann bestimmen, was in der ComboBox von dem Objekt angezeigt wird. Dann hast du in deiner ComboBox die Objekte drin und kannst mit
Code:
getSelectedItem()
und einem Cast auf das Objekt z.B. die ID holen.
Java:
public class ComboBoxInstitute
extends JComboBox {
public ComboBoxInstitute() {
DBHandler dbHandler = new DBHandler();
// Holt die Liste der Institute von der Datenbank
ArrayList<Institut> institutListe = dbHandler.getInstitutListe;
DefaultComboBoxModel modelInstitute = new DefaultComboBoxModel();
for(Institut i : institutListe)
modelInstitute.addElement(i);
// Der ComboBox wird das Model zugewiesen
setModel(modelInstitute);
}
}
du hast ComboBoxen, du hast Listener (ich sag jetzt nicht wo )
Listener können beliebigen Code enthalten, füge eine Zeile Code nach der anderen ein, da ist überhaupt nix dabei,
ich werde das für dich ganz gewiss nicht machen
Ok kein Problem der andere Post hat mir jetzt doch geholfen. So hatte ich das ja auch nicht gemeint. Aber danke für die Mühe. Bin nur momentan total am Verzweifeln.
Achja er gibt mir einen Fehler in dem GUI Code in Zeile 8 wegen dem executequery
Lösungsvorschlag wäre casten aber das hilft nix. Habe das gefühl dass conn nicht richtig übergeben wird.
PS der DB Code is eine extra Klasse. Wie kann man die Variable conn mit dem richtigen Wert übergeben an die GUI Klasse.
welche Fehlermeldung exakt?
wie sieht es nach dem Casten aus?
die Übergabe beliebiger Objekte von beliebig nach beliebig ist quasi immer dieselbe: im Konstruktor ein Parameter oder später per set-Methode,
innerhalb der Klasse in Attribut längerfristig speichern,
wenn die Information schon im Konstruktor benötigt wird, bleibt logischerweise nur eine der beiden Möglichkeiten
und unbedingt an Konventionen halten: Methoden, Variablen, packages klein schreiben (Treiber(), Fach, DB), nur Klassen groß
Die Fehlermeldung lautet:
The Method excecuteQuery(String) is undefined for the typeConnection
Wie muss ich jetzt genau meine Methoden in MySQL Connection umschreiben. Würde halt gerne meine Methoden weiterhin so aufrufen erst Treiber ladenn dann verbindung start dann ein beliebiges statement und zum schluss wieder verbindung ende.
Würdet ihr das auch so vorschlagen?
Ich brauch halt diese Methoden immer wiedre in meinem Programm deswegen habe ich das so ausfgebaut und nicht in einem Konstruktor.
Ok habe das jetzt mal mit einem statement umgesetzt nun kommt aber ein fehler:
* Treiber laden
* Verbindung aufbauen
Unable to connect.
java.sql.SQLException: No suitable driver found for localhost
at java.sql.DriverManager.getConnection(DriverManager.java:640)
at java.sql.DriverManager.getConnection(DriverManager.java:200)
at DB.MySQL_Connection.Verbindung_Start(MySQL_Connection.java:29)
at FA_einegeben.<init>(FA_einegeben.java:69)
at clicker.actionPerformed(clicker.java:189)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:374)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:829)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:873)
at java.awt.Component.processMouseEvent(Component.java:6203)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:5968)
at java.awt.Container.processEvent(Container.java:2105)
at java.awt.Component.dispatchEventImpl(Component.java:4564)
at java.awt.Container.dispatchEventImpl(Container.java:2163)
at java.awt.Component.dispatchEvent(Component.java:4390)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)
at java.awt.Container.dispatchEventImpl(Container.java:2149)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4390)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649)
at java.awt.EventQueue.access$000(EventQueue.java:96)
at java.awt.EventQueue$1.run(EventQueue.java:608)
at java.awt.EventQueue$1.run(EventQueue.java:606)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116)
at java.awt.EventQueue$2.run(EventQueue.java:622)
at java.awt.EventQueue$2.run(EventQueue.java:620)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:619)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
java.lang.NullPointerException
at FA_einegeben.<init>(FA_einegeben.java:70)
at clicker.actionPerformed(clicker.java:189)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:374)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:829)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:873)
at java.awt.Component.processMouseEvent(Component.java:6203)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:5968)
at java.awt.Container.processEvent(Container.java:2105)
at java.awt.Component.dispatchEventImpl(Component.java:4564)
at java.awt.Container.dispatchEventImpl(Container.java:2163)
at java.awt.Component.dispatchEvent(Component.java:4390)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)
at java.awt.Container.dispatchEventImpl(Container.java:2149)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4390)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649)
at java.awt.EventQueue.access$000(EventQueue.java:96)
at java.awt.EventQueue$1.run(EventQueue.java:608)
at java.awt.EventQueue$1.run(EventQueue.java:606)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116)
at java.awt.EventQueue$2.run(EventQueue.java:622)
at java.awt.EventQueue$2.run(EventQueue.java:620)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:619)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
Hier mein Code dazu:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTextField;
import DB.MySQL_Connection;
import com.cloudgarden.layout.AnchorConstraint;
import com.cloudgarden.layout.AnchorLayout;
import com.mysql.jdbc.Statement;
/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit [url=http://www.cloudgarden.com]Cloud Garden (Java Resources)[/url] for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class FA_einegeben extends JFrame {
//Variablen Deklaration
JComboBox Fach;
JComboBox Vorlesung;
JTextField A_1;
JTextField A_2;
JTextField A_3;
JTextField A_4;
JTextField Frage_Eingabe;
JButton Speicher_exit;
JButton Speichern;
public FA_einegeben() {
//Fenster Informationen
setTitle("*Fragen und Antworten eingeben*");
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setVisible(true);
try {
//AnchorLayout für variable Fenstereinstellung der Komponenten
AnchorLayout thisLayout = new AnchorLayout();
getContentPane().setLayout(thisLayout);
{
//Auswahl Fach
Fach = new JComboBox();
ArrayList items = new ArrayList();
Connection conn = null;
Statement statement = null;
DB.MySQL_Connection.Treiber();
DB.MySQL_Connection.Verbindung_Start();
ResultSet result = statement.executeQuery("SELECT Name FROM Fach");
while (result.next())
items.add(result.getString(1));
result.close();
DB.MySQL_Connection.Verbindung_Ende();
getContentPane().add(Fach, new AnchorConstraint(1, 502, 103, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
Fach.setModel(new DefaultComboBoxModel(items.toArray()));
Fach.setPreferredSize(new java.awt.Dimension(209, 35));
Fach.addItemListener( new ItemListener() {
public void itemStateChanged( ItemEvent e ) {
JComboBox selectedChoice = (JComboBox)e.getSource();
if ( selectedChoice.getSelectedItem().equals("Ende") )
System.exit( 0 );
}
} );
}
{
//Auswahl Vorlesung
ComboBoxModel VorlesungModel =
new DefaultComboBoxModel(
new String[] { "Vorlesung" });
Vorlesung = new JComboBox();
getContentPane().add(Vorlesung, new AnchorConstraint(1, 973, 103, 502, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
Vorlesung.setModel(VorlesungModel);
Vorlesung.setPreferredSize(new java.awt.Dimension(208, 35));
Vorlesung.addItemListener( new ItemListener() {
public void itemStateChanged( ItemEvent e ) {
JComboBox selectedChoice = (JComboBox)e.getSource();
if ( selectedChoice.getSelectedItem().equals("Ende") )
System.exit( 0 );
}
} );
}
{
//Fragen Eingabe
Frage_Eingabe = new JTextField();
getContentPane().add(Frage_Eingabe, new AnchorConstraint(158, 500, 236, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
Frage_Eingabe.setText("Bitte geben Sie eine Frage ein");
Frage_Eingabe.setPreferredSize(new java.awt.Dimension(208, 27));
}
{
//Antwort 1
A_1 = new JTextField();
getContentPane().add(A_1, new AnchorConstraint(283, 200, 364, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
A_1.setText("Antwort 1");
A_1.setPreferredSize(new java.awt.Dimension(76, 28));
}
{
//Antwort 2
A_2 = new JTextField();
getContentPane().add(A_2, new AnchorConstraint(399, 200, 481, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
A_2.setText("Antwort 2");
A_2.setPreferredSize(new java.awt.Dimension(76, 28));
}
{
//Antwort 3
A_3 = new JTextField();
getContentPane().add(A_3, new AnchorConstraint(515, 200, 594, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
A_3.setText("Antwort 3");
A_3.setPreferredSize(new java.awt.Dimension(76, 27));
}
{
//Antwort 4
A_4 = new JTextField();
getContentPane().add(A_4, new AnchorConstraint(629, 200, 707, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
A_4.setText("Antwort 4");
A_4.setPreferredSize(new java.awt.Dimension(76, 27));
}
{
//Speichern in die Datenbank
Speichern = new JButton();
getContentPane().add(Speichern, new AnchorConstraint(783, 212, 861, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
Speichern.setText("Speichern");
Speichern.setPreferredSize(new java.awt.Dimension(81, 27));
Speichern.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DB.Fragen.Einfügen();
DB.Antwort.Einfügen();
//Funktion für IDs erstellen? (mit SELECT von Tabellen)
DB.KombiFA.Einfügen();
}
});
}
{
//Speichern in die Datenbank und Fenster schließen
Speicher_exit = new JButton();
getContentPane().add(Speicher_exit, new AnchorConstraint(783, 651, 861, 236, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
Speicher_exit.setText("Speichern und schließen");
Speicher_exit.setPreferredSize(new java.awt.Dimension(183, 27));
Speicher_exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DB.Fragen.Einfügen();
DB.Antwort.Einfügen();
//Funktion für IDs erstellen? (mit SELECT von Tabellen)
DB.KombiFA.Einfügen();
System.exit(EXIT_ON_CLOSE);
}
});
}
{
this.setSize(451, 374);
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
So ich habe das jetzt so umgesetzt. Allerdings kommen immer noch Fehler. Die Klasse FA_eingeben in der der Ausschnitt steht wird aufgerufen durch eine andere Klasse, die das Hauptfenster darstellt.
Java:
//Auswahl Fach
Fach = new JComboBox();
ArrayList<String> items = new ArrayList();
DB.MySQL_Connection.Treiber();
DB.MySQL_Connection.Verbindung_Start();
Statement statement = DB.MySQL_Connection.createStatement();
ResultSet result = statement.executeQuery("SELECT Name FROM Fach");
while (result.next())
items.add(result.getString(1));
result.close();
DB.MySQL_Connection.Verbindung_Ende();
getContentPane().add(Fach, new AnchorConstraint(1, 502, 103, 28, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
Fach.setModel(new DefaultComboBoxModel(items.toArray()));
Fach.setPreferredSize(new java.awt.Dimension(209, 35));
Fach.addItemListener( new ItemListener() {
public void itemStateChanged( ItemEvent e ) {
JComboBox selectedChoice = (JComboBox)e.getSource();
if ( selectedChoice.getSelectedItem().equals("Ende") )
System.exit( 0 );
}
Fehlermeldung sieht so aus:
java.lang.NullPointerException
at FA_eingeben.<init>(FA_eingeben.java:69)
at clicker.actionPerformed(clicker.java:189)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:374)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:829)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:873)
at java.awt.Component.processMouseEvent(Component.java:6203)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:5968)
at java.awt.Container.processEvent(Container.java:2105)
at java.awt.Component.dispatchEventImpl(Component.java:4564)
at java.awt.Container.dispatchEventImpl(Container.java:2163)
at java.awt.Component.dispatchEvent(Component.java:4390)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)
at java.awt.Container.dispatchEventImpl(Container.java:2149)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4390)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649)
at java.awt.EventQueue.access$000(EventQueue.java:96)
at java.awt.EventQueue$1.run(EventQueue.java:608)
at java.awt.EventQueue$1.run(EventQueue.java:606)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116)
at java.awt.EventQueue$2.run(EventQueue.java:622)
at java.awt.EventQueue$2.run(EventQueue.java:620)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:619)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
ist dir der Sinn einer NullPointerException bekannt? wenn nicht solltest du dir jetzt 5 Min. Zeit nehmen und dies lernen,
das ist mit Abstand die wichtigste und zugleich einfachste Exception überhaupt:
sie bedeutet dass du auf eine Variable zugreifst, in der null drinsteht, an null kann man keine Methoden aufrufen
aus dieser einfachen Erkenntnis folgt logisch scharf, dass der StackTrace, insbesondere die letzte Zeile,
> at FA_eingeben.<init>(FA_eingeben.java:69)
mit der Zeilennummer 69 extrem wichtig ist, in Zeile 69 findet der null-Zugriff statt
wenn du anderen Menschen einfach nicht verrätst, welche Zeile deines Codes die Zeile 69 ist, wie sollen dir andere Menschen dann helfen?
es ist nichtmal völlig klar, ob der gepostete Codeausschnitt überhaupt der Konstruktor von FA_eingeben ist,
darauf musst du achten, lieber ganze Klassen oder zumindest komplette Methoden/ Konstruktoren mit Signatur posten
gehe einfach in die Klasse FA_eingeben, gehe in Zeile 69 und finde heraus welches Objekt null ist
und wenn gefunden warum null oder warum es eigentlich nicht null sein sollte und was hat vorher anscheinend dafür zu sorgen hat aber offensichtlich nicht funktioniert
Zeile 69 ist hier zeile 7 also folgendes : ResultSet result = statement.executeQuery("SELECT Name FROM Fach");
In meiner Datenbank steht schon ein Testeintrag in Tabelle Fach somit dürfte es auch keinen Null Pointer Fehler geben.
dann kann ja nur statement null sein, was eigentlich in der Zeile davor gesetzt wird..,
prüfe doch bitte zwischen diesen Zeilen per Ausgabe, ob statement null ist
das Connection-Objekt ist nicht von einer eigenen Klasse, oder?
Ich denke ma hier is das Problem dass statement = connection.createStatement() sein sollte, aber connection is in einer anderen Klasse und wird dort in der Funktion Verbindung_Start() initialisiert.
Jetzt weiß ich nicht wie ich das dort herausbekomme, habe ja extra eine Db Klasse MySQL Connection erstellt in der die Methoden Treiber() Verbindung_Start() und Verbindung_Ende() sind, sodass ich diese immer wieder verwenden kann.
Hast du da eine Idee. Sehr nett dass du benmüht bist mir zu helfen anscheinend sind mir doch ein paar sachen unklarer als gedacht.
ach so, dass ist auch nicht mehr Connection direkt, sondern MySQL_Connection.createStatement(),
muss also eine eigene Methode sein, die null zurückgibt (welches du noch nicht durch System.out.println() weiter bestätigt hast)
diese Methode musst du nun also unbedingt posten, wahrscheinlich besser die ganze Klasse,
Du hast da ja nur die Klasse vor das createStatement geschrieben, brauchst aber natürlich auch noch die dortige Connection, also entweder conn oder getConnection().
Wahrscheinlich müsste es so aussehen:
Ok also poste ich hier mal die aktuelle MySQL_Connection Klasse
Java:
package DB;
import java.sql.*;
import com.mysql.jdbc.Statement;
public class MySQL_Connection {
final static String hostname = "localhost";
final static String port = "3307";
final static String dbname = "clicker";
final static String user = "sabrina";
final static String password = "JSjp2pcXR7uFYC8u";
public static Connection conn = null;
public static void Treiber(){
try {
System.out.println("* Treiber laden");
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
}
catch (Exception e) {
System.err.println("Unable to load driver.");
e.printStackTrace();
}
}
public static Connection Verbindung_Start(){
try {
System.out.println("* Verbindung aufbauen");
String url = "jdbc:mysql://"+hostname+":"+port+"/"+dbname;
conn = DriverManager.getConnection(url, user, password);
}
catch (Exception e) {
System.err.println("Unable to connect.");
e.printStackTrace();
}
return conn;
}
public static void Verbindung_Ende(){
try {
System.out.println("* Verbindung geschlossen");
}
catch (Exception e) {
System.err.println("Unable to close.");
e.printStackTrace();
}
}
public static void setConn(Connection conn) {
MySQL_Connection.conn = conn;
try {
conn = DriverManager.getConnection(hostname, user, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConn() {
return conn;
}
public static void main(String[] args) {
Treiber();
Verbindung_Start();
Verbindung_Ende();
}
public static Statement createStatement() {
// TODO Auto-generated method stub
return null;
}
}
Ich habe schon angefangen getter und setter für connection zu erstellen. Habe jetzt die Befürchtung ich muss diese Klasse mit kompletten getter und setter für jede Variable erstellen. Kann das sein. wäre das ratsam. kann man nich dann auch so die Variablen in anderen Klassen direkt ansprechen um so Null Pointer zu vermeiden.
du hast eine NullPointerException und zwar ca eine Zeile nach Aufruf einer Methode mit Inhalt
Java:
public static Statement createStatement() {
// TODO Auto-generated method stub
return null;
}
die ich dir erst in 3 Postings aus der Nase ziehen muss?!
ok, bei so antiproduktiver Mitarbeit ist auch meine Geduld irgendwann zu Ende, ich schreib jetzt erstmal nicht weiter..
Sorry wollte dich nicht verärgern hab das alles anscheinend falsch gelernt. Ich will auch nur weiterkommen. Wollte auch nur wissen ob meine Idee jetzt richtig is oder nicht. aber ist schon ok ich versuche das jetzt mal auch ohne Hilfe
Ich hatte die Lösung doch gerade schon geschrieben. Die Methode createStatement würde ich aus der MySQL_Connection wieder löschen. Und warum da eine main-Methode drinsteht, weiss ich auch nicht.
Ich vermute mal, dass dir Eclipse vorgeschlagen hat, die Methode createStatement dort anzulegen und dies dann auch auf deinen Wunsch automatisch gemacht hat. Das liegt daran, dass die Methode createStatement zur Connection gehört, die bei dir vorhin gefehlt hatte. Also, einfach diese Methode wieder dort rauslöschen und die Connection einfügen, wie ich es vorhin geschrieben hatte, dann müsste es eigentlich funktionieren.
Hmm, und nun? Hast du das mal so probiert, wie ich geschrieben hatte? Funktioniert es? Brauchst oder willst du nun keine weitere Hilfe mehr? Na ja, hab nun auch gleich keine Zeit mehr...
Danke an Camino damit geht es. Danke ganz besonders an SlaterB du hast mir auch sehr geholfen. Die Befüllung funktioniert jetzt muss ich nur die andere ComboBox und deren Befüllung abhängig machen von dem was ich in Fach ComboBox ausgewählt habe. Wenn Ihr da schon Ideen habt wie man das mit getselectedItem lösen kann wäre ich froh wenn ihr mir tipps geben könnten.
Falls Ihr mir noch Tipps geben wollt.
Ich werde mich dann nochmal in den Semesterferien falls nicht zuviel Arbeit ansteht nochmal instensiv einem Java Kurs unterziehen.