2012-04-03 13 views
0

EDIT (NEU):Populate Kombinationsfeld mit Tabellenwerte

haben noch nicht herausgefunden, wie die cboxCustomers zu füllen. Ich war die letzten ein oder zwei Tage dabei, aber ohne Glück.

Falls kann jemand helfen: http://pastebin.com/e5wibRYw

ich von cats zu customers ging, btw.

versuchte ich Mr. Xymon's Ansatz, aber habe es nicht richtig zu implementieren, da es nicht funktioniert.

Was Ereignis ich die Bevölkerung zu behandeln pflegte ich bekam immer NullPointerException für jede Art Steuer/Veranstaltung, die ich versuchte, zu verwenden.

OLD:

Es gibt eine JForm. Darauf gibt es ein einzelnes Kombinationsfeld. Haben Sie auch einen einzigen Tisch mit Katzen - cats. Jede Katze hat id und catName.

Was ich tun wollte, war, als ich auf das Kombinationsfeld klicken, so dass es, füllen Sie es mit allen id von Katzen erweitern, die in cats Tabelle zu finden sind.

sloved. Asnwer unten. Leider erhalte ich zahlreiche unreported exception java.sql.SQLException von den Linien I mit > angegeben haben:

private void cboxCatsMouseClicked(java.awt.event.MouseEvent evt) { 
     // TODO add your handling code here: 
     // create an array list to be filled with cat's ids 
     ArrayList<String> cats = new ArrayList<String>(); 
     String query = "SELECT id FROM cats ORDER BY id"; 
     >java.sql.PreparedStatement stm = connection.prepareStatement(query); 

     >ResultSet rs = stm.executeQuery(query); 

     >while(rs.next()){ 
      >String cat = rs.getString("id"); 
      // add cat's ids tp the array list 
      cats.add(cat); 
     } 

     >rs.close(); 

     // populate the combo box 
     DefaultComboBoxModel model = new DefaultComboBoxModel(cats.toArray()); 
     cboxCats.setModel(model); 
    } 

ALTE ANTWORT:

Ich glaube, ich es fest. Ich musste nur alle markierten Codezeilen in eine große try-catch-Anweisung zusammenfassen, die SQLException fangen würde. Problem ist - das Kombinationsfeld wird nicht mit id Werten gefüllt, wenn ich es erweitere. Warum das? Benutze ich das falsche Ereignis?

+1

Veröffentlichen Sie bitte den vollständigen Ausnahmetext. Außerdem sollten Sie alle Datenbankabfragen in einem Hintergrund-Thread durchführen, wie er von einem SwingWorker-Objekt bereitgestellt wird. –

+2

In Bezug auf Ihre Bearbeitung: Auch hier sollten Sie alle Datenbankabfragen in einem Hintergrundthread durchführen. Warum versuchen Sie, die Combobox auf mouseClick zu füllen, da das keinen Sinn macht. Es wird Zeit brauchen, um die Datenbank abzufragen, und es wird wahrscheinlich Swings Fähigkeit stören, das Kombinationsfeld zu öffnen. Warum füllen Sie die Combobox nicht im Voraus aus? –

+0

Ja. Das macht mehr Sinn. Vielen Dank. – Bob

Antwort

2

Ist das nicht besser auf Ihre Combo-Box mit Katzennamen anstelle der ID bevölkern? Ich habe eine andere Lösung gefunden, indem ich den Feldwert direkt in das Modell eingefügt habe, anstatt ArrayList zu verwenden. Sie müssen es innerhalb des Konstruktors ausführen, um das Kombinationsfeld beim Laden des Formulars aufzufüllen.

DefaultComboBoxModel list = new DefaultComboBoxModel(); 
JComboBox cbo_cats = new JComboBox(list); 


// at constructor or a user-defined method that's called from constructor 
    try{  
     // assume that all objects were all properly defined 
     s = con.createStatement(); 
     s.executeQuery("SELECT * FROM cats ORDER BY catName"); 
     rs = s.getResultSet(); 
     while(rs.next()){ 
     //int id = rs.getInt("id"); 
     //list.addElement(id); 

     String c = rs.getString("catName"); 
     list.addElement(c); 
     } 
    }catch(Exception err){ 
     System.out.println(err); 
    } 

Wie Sie sehen können, habe ich keine vorbereiteten Anweisungen verwendet, aber Sie können das leicht ändern.

+0

Hmm. Das einzige Problem, das ich dabei sehe, ist, dass das Kombinationsfeld nur dann gefüllt wird, wenn das Formular geladen wird. Das ist mein Programm hat Registerkarten.Auf der ersten Registerkarte können Benutzer Daten zu jeder Katze anzeigen, eine bestimmte Katze aktualisieren, entfernen und eine neue Katze hinzufügen. Die zweite Registerkarte enthält das Kombinationsfeld. Nehmen wir an, das Formular geladen, füllte die Combo-Box mit bereits bestehenden Katzen auf Ihrem Weg. Nun, was passiert, wenn ich eine neue Katze erstelle, existiere oder sie auf der ersten Registerkarte meiner Anwendung lösche. Das wird die Tabelle in der Datenbank ändern, was bedeutet, dass das Kombinationsfeld veraltete Informationen enthalten wird. Was kann ich dagegen tun? – Bob

+1

Es gibt ein Heilmittel dafür. Erstellen Sie eine Methode, beispielsweise fetchCategory(), die Codes zum Füllen des Kombinationsfelds enthält. Das ist die gleiche Methode, die Sie vom Konstruktor aufrufen werden. Was Sie am Anfang hinzufügen müssen, ist ein Code, der alle Elemente aus dem Kombinationsfeld entfernt, indem Sie das DefaultComboBoxModel-Objekt verwenden, das ich in meinem Beispiel als Liste bezeichnet habe. Also wäre es so, list.removeAllElements(); Schließlich, rufen Sie einfach die Methode fetchCategory(); Nach dem Ausführen jeder Kategorie Operation wie Aktualisieren, Löschen, Einfügen. Das sollte den Inhalt Ihres Kombinationsfelds aktualisieren. –

+0

Für die 'fetchCategoty()', meinst du so etwas - http://pastebin.com/JHH0yLhD Ignoriere die Verwechslung zwischen 'cats' und' customers' – Bob