MS SQL Datenbankzugriff und JTable

karl001

Grünschnabel
Hallo,
erst einmal das Grundlegende: Ich möchte ein Programm schreiben welches auf eine MS SQL Datenbank zugreift, diese Daten in eine JTable schreibt und mit dieser man die DB editieren kann. Was ich bisher geschafft habe ist die DB-Tabelle in eine JTable zu bekommen anhand eines TableModels. Jedoch weiss ich nicht wie ich das editieren anstellen soll. Das beste wäre man könnte die Daten erst in der JTable ändern und dann per "Knopfdruck" wieder in die DB schreiben. Genauer gesagt müssen nur 2 Spalten geändert werden. Allerdings verstehe ich setValueAt() vom TableModel nicht. Bitte helft mir, es ist dringend.

PS: Wie kann man per einfachem Klick eine JTable Zelle editieren und auch dessen Inhalt gleichzeitig ganz markieren?

Hier meine TableData:

Code:
public class MyTableModel extends AbstractTableModel implements TableModel
{ 
	private static final long serialVersionUID = 1L;
	
	private ResultSet rst; 
	private ResultSetMetaData meta; 
	private Connection con;
	private String s;

	private Object colOb; 

	private String[] headers;
	
    
   public MyTableModel(ResultSet resultSet, Connection con) throws SQLException 
   { 
      this.rst = resultSet; 
      this.con = con; 

      try 
      { 
         this.meta = this.rst.getMetaData(); 

      } 
      catch(SQLException ex) 
      { 
         System.out.println(ex.getMessage()); 
      } 
   } 
    
    
   public int getRowCount() 
   { 
      try 
      { 
         this.rst.last(); 
         return this.rst.getRow(); 
      } 
      catch(Exception ex) 
      { 
         System.out.println(ex.getMessage()); 
         return -1; 
      } 
   } 
    
   public int getColumnCount() 
   { 
      try 
      { 
         return this.meta.getColumnCount(); 
      } 
      catch(SQLException ex) 
      { 
         System.out.println(ex.getMessage()); 
         return -1; 
      } 
   } 
    
   public String getColumnName(int column) {

	  try {
		  headers = new String[getColumnCount()];
	      for (int h = 1; h <= getColumnCount(); h++) {
	        headers[h - 1] = meta.getColumnName(h);
	      }
	  } catch (SQLException e) {
		  e.printStackTrace();
	   }
	  return headers[column];
   }
    
   public Object getValueAt(int row, int column) 
   { 
      try 
      { 
         this.rst.absolute(row+1);
         colOb = this.rst.getObject(column+1); 
      } 
      catch(SQLException ex) 
      { 
         System.out.println(ex.getMessage()); 
      }  
       return colOb;
   } 
   
   public boolean isCellEditable(int rowIndex, int columnIndex) {
	   
		try {
			s = meta.getTableName(1);
		} catch (SQLException e) {
			e.printStackTrace();
		}

		if (s.equals("X_KNA1")) {
			   if (columnIndex==2 | columnIndex == 7)
				   return true; 
		   		else 
		   			return false; }
		 else
			 	return false;
 
   }
   
   public void setValueAt(Object aValue,int row,int col) {
       String newVal = (String)aValue;

		try {
			Statement stC = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
			int updated = stC.executeUpdate( "UPDATE " + meta.getTableName(1) + " SET " + getColumnName(col) + " = '"+ newVal + "' WHERE "+ getColumnName(1) + " = '" + getValueAt(row,1) + "'");
			
			Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			ResultSet rs = st.executeQuery( "select * from " + meta.getTableName(1));
			this.rst = rs;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		//System.out.println(other.getSelectionModel().getLeadSelectionIndex());
		getValueAt(row,col);
	    fireTableCellUpdated(row, col);
        System.out.println("changesVA");
   }
 
}

Edit: Okay ich habs soweit selbst hinbekommen und als Lösung mal mein TableModel gepostet wenn jemand das als Anreiz nehmen möchte. Aber Achtung, die Werte werden sofort! in der DB geändert. Allerdings bekomme ich es immer noch nicht den Textinhalt einer Zelle nach einem Klick zu markieren. Nach einem Klick ist sie zwar schon editierbar aber nicht markiert. Hab schon das halbe Internet durchsucht und finde nichts.
 
Zuletzt bearbeitet:
Da soviele Lösungsvorschläge kamen hab ichs dann doch selbst rausbekommen. Bei einem Maus oder TastenEvent folgendes dazuschreiben:
Code:
TABELLE.editCellAt(TABELLE.getSelectedRow(), TABELLE.getSelectedColumn());
TABELLE.getEditorComponent().requestFocus();
JTextField text = (JTextField)TABELLE.getEditorComponent();
text.selectAll();
Schon ist bei einem Klick oder per Tastaturauswahl der komplette Inhalt markiert und editierbar. Vorsicht: Die Zellen müssen natürlich editierbar sein und links rechts funktioniert dann per Tastatur nicht mehr da man sich im Editiermodus befindet.
 
Zurück