shad0w Geschrieben 8. April 2003 Geschrieben 8. April 2003 Hi, ich habe eine abfrage: select id, text from tabelle order by text; den text moechte ich in einer JComboBox darstellen, die ID im 'hinterkopf' behalten, um spaeter insert statements zu erstellen. wenn ich nun nen 2 Dimensionalen Vector verwende, wird mir der text und die id mit klammern '[]' ausgegeben, d.h. z.b. [TEXT] ... wenn ich allerdings nen hashtable verwende (id als key, text als value) komm ich nicht mehr richtig an den key ran. desweiteren sind sortiermethoden etc. recht schwierig. hat jemand ne bessere moeglichkeit?? danke. Zitieren
GreenBeret Geschrieben 8. April 2003 Geschrieben 8. April 2003 wieso nimmste net einfach ein 2 dimensionales array???? Zitieren
shad0w Geschrieben 8. April 2003 Autor Geschrieben 8. April 2003 ein array muss doch mit einer festen groesse initialisiert werden ... (afair) ... und die daten aus der datenbank sind eben dynamisch ... Zitieren
GreenBeret Geschrieben 8. April 2003 Geschrieben 8. April 2003 hajo aber da wo das das select machst weiß du ja wie groß das array sein muss. kannst ja vorher ein select count(*) machen oder so un dann halt das array erzeugen mit [spalten die sin ja eh fest also 2][Zeilen das count von oben] ^^so funzt es Zitieren
Jaraz Geschrieben 8. April 2003 Geschrieben 8. April 2003 Also, ich würde eine eigene Klasse Datensatz schreiben, mit einem int und einem String. Bei dieser Klasse überschreibst du dann die toString() Methode, sodaß in der JComboBox das richtige angezeigt wird. Nun kannst du deine Rows aus dem ResultSet in diesen Objekttyp umwandeln und in einen Vector oder ein Array packen und somit der JComboBox übergeben. Gruß Jaraz PS: Noch besser wäre ein eigenes ComboBoxModel, aber das willst du ja nicht. Zitieren
Peeter Geschrieben 8. April 2003 Geschrieben 8. April 2003 Wie wär´s denn mit einer ArrayList (evtl. einer Arraylist von ArrayLists)? Die sind dynamisch in der Größe änderbar und haben noch andere div. Vorteile. Also ich nutze die am liebsten. Peet Zitieren
shad0w Geschrieben 8. April 2003 Autor Geschrieben 8. April 2003 @GreenBeret: und was machst du, wenn innerhalb der zeit zwischen select count(*) und select id, text; ein datenstatz eingefuegt wird? im besten fall stimmt nur das array net, aber wahrscheinlich bekommst ne sqlexception oder sowas ... @Peeter: wie funtzt das mit der arraylist? Zitieren
GreenBeret Geschrieben 8. April 2003 Geschrieben 8. April 2003 dann machst halt nur ein selet des select id,text oder wie des war!! un dann gibts beim rs.getCount oder so irgendwas?? un dann hast du au die anzahl zeilen un nur ein select!!! Zitieren
Peeter Geschrieben 8. April 2003 Geschrieben 8. April 2003 java.util.ArrayList Schau mal in die JDoc. Da ist dann alles beschrieben. Ein Element hinzufügen: arl.add(Object); Ein Elemt holen: arl.get(Index); Man kann die ArrayList auch in ein Object[] überführen! Peet Zitieren
shad0w Geschrieben 8. April 2003 Autor Geschrieben 8. April 2003 @GreenBeret: wuerde auch gehen, ok. @Peeter: hab ich schon ... den index kann ich allerdings nicht zur speicherung der id verwenden ... muesste also auch zweidimensional sein ... ich schau mal ... Zitieren
shad0w Geschrieben 8. April 2003 Autor Geschrieben 8. April 2003 vergesst das mit der abstractlist ... iss mir zu kompliziert ... Zitieren
shad0w Geschrieben 8. April 2003 Autor Geschrieben 8. April 2003 also, ich hab nun mal ne arraylist gebastelt ... funtzt auch soweit ganz gut ... allerdings nur mit dem ersten wert. d.h. die felder sind nun alle mit id's gefuellt. wie bekomm ich nun die 2te 'spalte' ? public ArrayList getTableIdResultList( String sql ) { ArrayList row; ArrayList col; try { row = new ArrayList(); col = new ArrayList(); stmt = conn.createStatement(); rset = stmt.executeQuery( sql ); ResultSetMetaData rsmdMetaData = rset.getMetaData(); int columns = rsmdMetaData.getColumnCount(); for ( int i = 1; i < columns; i++ ) { while ( rset.next() ) { row.add( rset.getObject( i ) ); } col.addAll(row); } rset.close(); stmt.close(); } catch ( Exception e ) { e.printStackTrace(); return null; } return col; } Zitieren
Peeter Geschrieben 8. April 2003 Geschrieben 8. April 2003 Mach mal nicht col.addAll(row); sondern col.addAll(i, row); ! Zitieren
shad0w Geschrieben 8. April 2003 Autor Geschrieben 8. April 2003 java.lang.IndexOutOfBoundsException: Index: 1, Size: 0 at java.util.ArrayList.addAll(ArrayList.java:461) at de.waltertelemedien.jActivityReport.jARjdbc.getTableIdResultList(jARjdbc.java:147) ?? Zitieren
Peeter Geschrieben 8. April 2003 Geschrieben 8. April 2003 Was hat denn dein "columns" für ne size()? Zitieren
shad0w Geschrieben 8. April 2003 Autor Geschrieben 8. April 2003 columns: 2 hab schon mit i = 0 und i = 1 probiert, und auch mit <= columns und < columns ... Zitieren
shad0w Geschrieben 8. April 2003 Autor Geschrieben 8. April 2003 *narv* da iss ne abfrage ohne result drin ... wie bekomm ich das hin, dass da keine nullpointerexception beim erstellen der JComboBox auftritt? Zitieren
Peeter Geschrieben 8. April 2003 Geschrieben 8. April 2003 nur wenn im ResultSet was drin ist, dann deine ComboBox erstellen. if(rs.next()) { //deine ComboBox } // else nix Zitieren
shad0w Geschrieben 8. April 2003 Autor Geschrieben 8. April 2003 so einfach ist es leider nicht ... aber so funtzt's: public ArrayList getTableIdResultList( String sql ) { ArrayList row; ArrayList col; boolean result; try { row = new ArrayList(); col = new ArrayList(); stmt = conn.createStatement(); rset = stmt.executeQuery( sql ); ResultSetMetaData rsmdMetaData = rset.getMetaData(); int columns = rsmdMetaData.getColumnCount(); System.out.println( "sql: " + sql ); for ( int i = 0; i < columns; i++ ) { result = false; while ( rset.next() ) { result = true; row.add( rset.getObject( i + 1 ) ); } if ( result == true ) { col.addAll( i, row ); } } rset.close(); stmt.close(); if ( col.size() <= 0 ) { col.add( "" ); } } catch ( Exception e ) { //e.printStackTrace(); return null; } return col; } Zitieren
Peeter Geschrieben 8. April 2003 Geschrieben 8. April 2003 Na gut. So geht´s natürlich auch! Peet Zitieren
shad0w Geschrieben 8. April 2003 Autor Geschrieben 8. April 2003 *narv* ich bekomm heut noch nen nervenzusammenbruch. das funtzt nicht, dass ich zuerst alle rows, dann alle cols durchgehe. da das resultset dann einmal durchlaufen ist, und ich es nicht zuruecksetzen kann ... *grml*. dann hab ich es eben umprogrammiert, dass pro row alle cols ausgelesen werden, nun geht das mit den brackets '[]' wieder los. ich werd mir wohl doch ne eigene implementation einer liste schreiben muessen, die meine id und den text dazu speichert ... Zitieren
Jaraz Geschrieben 8. April 2003 Geschrieben 8. April 2003 Original geschrieben von -leliel- ich bekomm heut noch nen nervenzusammenbruch. Dabei ist das doch so einfach, aber du versuchst meine Vorschläge ja nicht einmal. import java.awt.*; import java.awt.event.*; import java.sql.*; import java.util.*; import javax.swing.*; public class Start extends JFrame implements ItemListener { private JComboBox comboBox; public Start() throws Exception { Class.forName("org.gjt.mm.mysql.Driver"); // ResultSet holen Connection con = DriverManager.getConnection("jdbc:mysql://localhost/test", "user", "pass"); Statement stmt = con.createStatement(); ResultSet resultSet = stmt.executeQuery("select id, text from daten"); // ArrayList bauen ArrayList list = new ArrayList(); while (resultSet.next()) { Datensatz datenSatz = new Datensatz(); datenSatz.setId(resultSet.getInt("id")); datenSatz.setText(resultSet.getString("text")); list.add(datenSatz); } resultSet.close(); stmt.close(); // Panel füllen JPanel panel = new JPanel(); comboBox = new JComboBox(list.toArray()); comboBox.addItemListener(this); panel.add(comboBox); this.getContentPane().add(panel); pack(); setVisible(true); } // Frame schließen public void processWindowEvent(WindowEvent e) { if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } else { super.processWindowEvent(e); } } public static void main(String[] args) { try { Start start = new Start(); } catch (Exception e) { e.printStackTrace(); } } // Auf ComboEvents reagieren public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { System.out.println(((Datensatz) comboBox.getSelectedItem()).getId()); } } } public class Datensatz { private int id; private String text; public int getId() { return id; } public String getText() { return text; } public void setId(int id) { this.id = id; } public void setText(String text) { this.text = text; } public String toString() { return text; } } Gruß Jaraz Zitieren
shad0w Geschrieben 8. April 2003 Autor Geschrieben 8. April 2003 mein retter ... :hodata sorry, aber ich hatte deine vorschlaege als 'zu kompliziert' ausgemustert ... werd's mir aber merken und beim naechsten mal (was hoffentlich nicht gleich morgen ist ... will auch mal was selbst hinbekommen ) eher beachten ... danke vielmals. Zitieren
Jaraz Geschrieben 8. April 2003 Geschrieben 8. April 2003 Original geschrieben von -leliel- sorry, aber ich hatte deine vorschlaege als 'zu kompliziert' ausgemustert ... Das nächste mal versuche ich mich einfacher auszudrücken. Gruß Jaraz PS: Das ganze geht übrigens noch komfortabler aber ich glaube das würde jetzt zuweit gehen. Zitieren
shad0w Geschrieben 8. April 2003 Autor Geschrieben 8. April 2003 nene, liegt nich an deiner ausdrucksweise ... ich sollte wohl eher genauer nachlesen ... Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.