Veröffentlicht 8. April 200322 j 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.
8. April 200322 j ein array muss doch mit einer festen groesse initialisiert werden ... (afair) ... und die daten aus der datenbank sind eben dynamisch ...
8. April 200322 j 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
8. April 200322 j 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.
8. April 200322 j 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
8. April 200322 j @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?
8. April 200322 j 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!!!
8. April 200322 j 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
8. April 200322 j @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 ...
8. April 200322 j 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; }
8. April 200322 j java.lang.IndexOutOfBoundsException: Index: 1, Size: 0 at java.util.ArrayList.addAll(ArrayList.java:461) at de.waltertelemedien.jActivityReport.jARjdbc.getTableIdResultList(jARjdbc.java:147) ??
8. April 200322 j columns: 2 hab schon mit i = 0 und i = 1 probiert, und auch mit <= columns und < columns ...
8. April 200322 j *narv* da iss ne abfrage ohne result drin ... wie bekomm ich das hin, dass da keine nullpointerexception beim erstellen der JComboBox auftritt?
8. April 200322 j nur wenn im ResultSet was drin ist, dann deine ComboBox erstellen. if(rs.next()) { //deine ComboBox } // else nix
8. April 200322 j 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; }
8. April 200322 j *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 ...
8. April 200322 j 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
8. April 200322 j 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.
8. April 200322 j 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.
8. April 200322 j nene, liegt nich an deiner ausdrucksweise ... ich sollte wohl eher genauer nachlesen ...
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.