Werte aus Resultset in eine JTable in entspr. Spalten einfügen ?

hi,
ich möchte abgefragte Werte aus einzelnen Spalten einer Datenbank in die entspr. Spalten meiner JTable einfügen (aus einem query Resultset)
nur hab ich Probleme die Werte in die entspr. Spalten meiner JTAble einzufügen…


import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.print.PrinterException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.MessageFormat;
import java.util.ResourceBundle;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;

import de.htw.saarland.kinodb.sql.DBConnection;

public class TableDBTestDemo extends JFrame {

	private JPanel contentPane;
	private DBConnection connection;
	private Connection con;
	private JTable table;
	private JScrollPane scrollpane;
	private TableColumn column;
	
	
	
	public static void main(String[] args) throws ClassNotFoundException, SQLException, PrinterException {
		new TableDBTestDemo();
	}
	
	public TableDBTestDemo() throws ClassNotFoundException, SQLException, PrinterException {
		setTitle("Test Demo"); 
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 700, 400);			
		contentPane = new JPanel();		
		add(contentPane);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		
		
		//contentPane.setLayout(new BorderLayout());
		
		
		DBConnection.init();
		con = DBConnection.createConnection();
		
//		TableModel dataModel = new AbstractTableModel() {
//	        
//			private static final long serialVersionUID = 1L;
//			public int getColumnCount() { return 2; }
//	        public int getRowCount() { return 5;}	
//			
//	        
//	        public Object getValueAt(int row, int col) { 
//	        	return new Integer(row*col); 
//	        	}
//	      };
		
		class MyTableModel extends AbstractTableModel {
	      String[] columnNames = {"testname","testdauer"};
	      Object[][] data = {
	    		    {"sss", "120"},
	    		    {"aaa", "90"},	    		     
	    		    {"hhhh", "90"},
	    		    {"asdasdasd", "130"},
	    		    {"gggg", "90"}
	      };		      
	      
	      public int getColumnCount() {
  	        return columnNames.length;
  	    }

  	    public int getRowCount() {
  	        return data.length;
  	    }

  	    public String getColumnName(int col) {
  	        return columnNames[col];
  	    }

  	    public Object getValueAt(int row, int col) {
  	        return data[row][col];
  	    }

  	    public Class getColumnClass(int c) {
  	        return getValueAt(0, c).getClass();
  	    }
    }
	      

	    final Vector COLUMN_IDENTIFIERS = new Vector() {
	        {
	            add("testname");
	            add("testlaenge");
	            
	        }
	    };
	    
	      table = new JTable(new MyTableModel());	      
	      table.setAutoCreateRowSorter(true);
	      scrollpane = new JScrollPane(table);
	      table.setFillsViewportHeight(true);
	      column = table.getColumnModel().getColumn(0);
	      column.setPreferredWidth(200);
	      
	      System.out.println(table.getColumnName(0));
	      
	      String query = "SELECT " +"testName, " +  "testLaenge " + "FROM TestDB";
	      

	      
	      Statement stmt = con.createStatement();
	      ResultSet rs = stmt.executeQuery(query);
	      while (rs.next()) {
	    	  String testname = rs.getString("testName");
	    	  short testlaenge = rs.getShort("testLaenge");
	    	  
	    	  //HIER SOLLEN DIE AUSGELESENEN WERTE IN MEINE TABELLENSPALTEN EINGETRAGEN WERDEN...

	    	  }
	    	  
	    	  con.close();
	    	  stmt.close();
	      
	      
	      contentPane.add(scrollpane);

	     
	      
	      setVisible(true);
	      
//	      MessageFormat header = new MessageFormat("Page {0,number,integer}");
//	      try {
//	    	    table.print(JTable.PrintMode.FIT_WIDTH, header, null);
//	    	} catch (java.awt.print.PrinterException e) {
//	    	    System.err.format("Cannot print %s%n", e.getMessage());
//	    	}
	      
		}
}

ich weiss nicht wie ich das am besten mache, soll ich ein DefaultTableModel nehmen weil es da mehr angepasste Methoden gibt ? kann man das am besten über Vector machen, wenn ja wie? Oder gibs da eingebaute Methoden wie table.addRow() und wie funktionieren die?

*** Edit ***

ok habs jetzt rausgefunden, man muss ein DefaultTableModel nehmen, dann gehts mit dieser MEthode :

 ((DefaultTableModel)table.getModel()).addRow(new Object[]{test_name,test_laenge});```

ist aber ziemlich merkwürdig, gehts nicht noch anders oder eleganter? Bzw ein bisschen intuitiver?

*** Edit ***

kann mir vllt noch jemand erklären was ```new Object[]{test_name,test_laenge});``` bedeutet? 
Wird da einfach ein eindimensionales Object Array kreirt mit 2 Tupeln? also bestehend aus test_name , test_laenge

sonst muss man sich um jedes Thema schlagen und hier bleibt eins offen…

es wird ein Array erstellt, ja,
syntaktisch schöner geht es mit Hilfsmethoden, ab Java 1.5 mit …-Varargs-Parameter,
sonst notfalls einer Reihe Methoden, irgendwo versteckt, 1, 2, 3, … Parameter die jeweils ein Array zurückgeben,

((DefaultTableModel)table.getModel()) geht einfacher wenn du für das Model eine Variable anlegst,
brauchst du eh öfter als die table selber, für welche du eine Variable hast

wenn das Model von eigener überschriebener Klasse mit Hilfsmethode ist, dann ginge

model.addRow(test_name,test_laenge);

viel einfacher kann es kaum werden


wie du grundsätzlich vorgehen willst, welche Daten aus ResultSet, auf welche Weise zu einer Zeile zusammengefasst,
nach Namen, gar anscheinend extra Variablen, oder nur per Liste die Spalten durchgehen,
das ist zunächst eine organisatorische Entscheidung, allgemeine Lösung oder individuelle Bearbeitung einzelner Querys?
den restlichen Java-Code habe ich vorerst nicht angeschaut,

nach der mittleren Zeit eh abzuwarten, ob Thema noch aktuell :wink: