MySQL Row und ColumnIndex aus einer JTable (mysqlDb) selectieren

Bladetown

Mitglied
Hallo zusammen,

ich habe eine Anwendung geschrieben, die eine MYSQL DB ausliest und in einer JTable darstellt, nun möchte ich in der JTable eine Zeile auswählen und bearbeiten / löschen.
Das Löschen habe ich halbwegs hinbekommen, allerdings habe ich ein Problem, mir generell den Index der selectierten Zeile ausgeben zu lassen!

Hat diesbezüglich jemand eine Idee, oder vielleicht einen Lösungsansatz für mich?!?!?
Danke für Eure Hilfe!!!!


LG:rtfm:
 
Hi,

also ich hab das immer so gelöst, dass ich die ID eines Datensatzes mit in die JTable geschrieben habe
und dann einfach die Spalte unsichtbar gemacht habe, sprich die breite auf 0 gesetzt.

Dann kannst du einfach mit Hilfe von getSelectedColumn(), getSelectedRow() und dann
getValueAt (int row, int column) beim auswählen der Zeile die ID des Datensatzes mit auslesen.

Gruß
 
Zuletzt bearbeitet:
Hi und Danke für die schnelle Antwort,

das hatte ich schon getan, allerdings bekam ich immer als Ergebnis einen Wert von -1, welchen ich nicht zuordnen konnte!

Ich weiss nicht wie ich die Methoden getSelectedColumn() und getSelectedRow() einbinden soll, sodass nicht die Fehlermeldung

"Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1"

kommt!

LG:rtfm:
 
Zuletzt bearbeitet:
Ok hier ein kleines ganz simples Beispiel auf das wichtigste reduziert:

Java:
private DefaultTableModel modelBudgets = new DefaultTableModel();

/**
*Creates a table and fill it with the dates from the budgets.
*/
public void createTable() {
     
for (int i = 0; i < budgetLib.getBudgets().size(); i++) {
     modelBudgets.addRow(budgetLib.getBudgets().elementAt(i).getDates());
 }

}

/**
* Returns the ID of a budget plan based on the selected row.
*/
public void mousePressed(MouseEvent e) {
		
String idBudget = "-1";
int row = tableBudgets.getSelectedRow();

if (row > -1) {
   idBudget = (String) modelBudgets.getValueAt(row, 1);
} else {
   return null;
}
   return idBudget;
}

Hoffe das ganze ist verständlich. 🙂

Gruß
 
Hallo ich versuche dein Beispiel umzusetzten, verstehe allerdings nicht warum du das so setzt???

String idBudget = "-1";

Bei meiner Programmierter Auswahl des Zeilenindexes bekommen ich leider immer diesen Wert "-1" egal in welcher Zelle ich mich befinde!!!

LG
 
Der Quelltext ist tatsächlich etwas aus dem Kontext gerissen vermute ich, da dass so in dieser Form auch für mich keinen Sinn ergibt.

Du erhälst immer genau dann -1 von der Methode [c]getSelectedRow()[/c], wenn aktuell keine row selektiert ist (so steht es auch im JavaDoc). Da ich deinen Quelltext nicht kenne kann ich nur vermuten, dass du mit diesen Index versuchst den Datensatz an der Stelle -1 aus deinem Model zu löschen, was natürlich nicht möglich ist. Hast du vielleicht nen kleines Beispiel, womit sich dein Fehler reproduzieren lässt, oder kannst du die Stelle mal aufzeigen, bei der du die Exception bekommst? Dann kann man dir sicher weiter helfen.

Beim Löschen musst du natürlich prüfen, dass auch ein entsprechender Datensatz in der Table selektiert ist. Entweder fängst du ab, dass aktuell kein Datensatz selektiert ist, fragst also vorher ab, ob [c]getSelectedRow() == -1[/c] ist oder du nutzt stattdessen gleich [c]getSelectedRows()[/c], welche dir alle aktuell selektierten Rows zurück gibt und falls keine selektiert ist, lediglich ein leeres Array (was bedeuten würde, dass du einfach nichts löschen musst).
 
Hi,

ja ich merke gerade ich hab da völlig falschen Code gepostet habe 😀

Was ich dir eigtl. damit zeigen wollte ist, wie du die ausgewählte Zeile ausliest.
Das ganze funktioniert korrekterweise so:

Java:
public void mousePressed(MouseEvent e) {
  checkSelection();
}


public int checkSelection(){
   int row = table.getSelectedRow();
 
    if (row > -1) {
       System.out.println("Datensatz Nr: "+ row + " selektiert!");
    } else {
     System.out.println("Kein Datensatz selektiert!");
    }
  }

Füllst du dein TableModel korrekt?
Lass dir doch mal die größe von deinem Model ausgeben.

Gruß
 
Zuletzt bearbeitet:
Hallo zusammen,

ich versuche mal meinen Code zusammen zu tragen, da er übergreifend aus 4 Klassen besteht!
Allerdings so einfach wie Raziell erst geschrieben hat funktioniert es leider nicht!

Der selectierte Indexwert soll anschließend an eine SQL Query Übergeben werden und diesen dann ausführen!

Ich versuche den Code zusammen zu fassen!!

LG:rtfm:
 
das ist meine Methode, mit diversen Versuchen, bzw. Test´s den idx heraus zu bekommen!!!

Java:
	public static void deleteRow() throws SQLException{
		
		Object 			idx;
		int row	=		einfacheSqlAbfrageTableGui.jtView.getSelectedRow();
		int menge	=	0;
		
		
		try{
		
			// Aufbau der Verbindung zur DB und Tabelleninhalte in rs ablegen		
			stmtCr = einfacheSqlAbfrageDbStatement.con.createStatement();	
			
			idx = einfacheSqlAbfrageTableGui.jtView.getValueAt(0, 0);			
			// Ausführende SQL-Abfrage
//			rsCr = stmtCr.executeUpdate("DELETE FROM name WHERE Id_Name='" + rowId+ "'");
			
			// Zählschleife für Anzahl der Datensätze
			for (int z = 0; z < einfacheSqlAbfrageTableGui.tblMdl.getRowCount(); z++){
				// Summe an Datensätzen in der DB
				menge = z; 
			}
			
			// Anzahl der Datensätze ausgeben ( +1 weil Datensätzte mit 0 beginnen)
			System.out.println("Gesamtanzahl der Datensätze: "+ (menge +1));
			
			
			
		}
		catch(SQLException e){
			
		
			e.printStackTrace();
		}
	
		
	}


Kann es sein, das ich kein Ergebnis bekomme, weil mit der MouseListener / MouseEvent fehlt???
 
Zuletzt bearbeitet:
Was soll den die Methode machen?? Dem Namen nach eine Zeile löschen. Aus der JTable oder aus einer Datenbanktabelle? Oder aus beiden?

[JAVA=18] for (int z = 0; z < einfacheSqlAbfrageTableGui.tblMdl.getRowCount(); z++){
// Summe an Datensätzen in der DB
menge = z;
}[/code]
Die for-Schleife kann man sich auch sparen ;-)
Kann es sein, das ich kein Ergebnis bekomme, weil mit der MouseListener / MouseEvent fehlt???
Und was soll da jetzt ein MouseListener mit zu tun haben??
 
Hallo Michael,

wie oben schon beschrieben sind das diverse Test´s!
Mit der FOR-Schleife lasse ich mir lediglich die Anzahl der Datensätze widergeben.

Die Frage mit dem MouseEvent kommt daher, das ich nicht genau weiss wie das "getSelectedRow" realisiert wird, bzw. wie die Selektion funktioniert, reicht es wenn ich in der JTable den Wert "markiere" oder muss ich da mit einem Event arbeiten?!!?

LG:rtfm:
 
Jede JTable besitzt von grund auf ein ListSelectionModel. Dieses Model kümmert sich selbstständig darum, welche Zeilen gerade selektiert sind. Wenn du nun die JTable fragst, welche Zeilen gerade auf ihr markiert sind (welche Zeilen der User gerade auf der Tabelle selektiert hat), dann fragt getSelectedRow() intern dieses ListSelectionModel ab und gibt dir die entsprechenden Werte zurück. Selbiges gilt natürlich auch für Spalten mit den entsprechenden pendant getSelectedColumn().

Einen MouseListener oder ähnliches brauchst du dafür nicht anmelden, diese Funktionalität ist direkt gegeben.

Um deine Frage noch einmal kurz zu beantworten:

Bladetown hat gesagt.:
reicht es wenn ich in der JTable den Wert "markiere" oder muss ich da mit einem Event arbeiten?!!?
Ja, markieren genügt.
 
Hi,

nochmal als Tipp. Schreibe die ID eines Datensates aus der Datenbank mit in dein TableModel.

Kleines Beispiel:

Java:
Object[] array = new Object[3];

array[0] = id;
array[1] = text;
array[2] = wert;

model.addRow(array);

Dann kannst du sicher sein, dass die ID immer an erster Stelle im Model steht.
Jetzt musste du nurnoch wie in meinem Beispiel die selektierte Zeile ermitteln und kann dier dann praktisch mit
Java:
getValueAt(row , 1)
immer die ID des Datensatzes holen.

Anhand der ID kannst du ja dann den entsprechenden Datensatz ändern bzw. löschen.

Gruß
 
Zuletzt bearbeitet:
Mit der FOR-Schleife lasse ich mir lediglich die Anzahl der Datensätze widergeben.
Naja, dann schau sie Dir nochmals genauer an.
Du lässt eine Variable von 0 bis < ...getRowCount() hochzählen.
Rate mal welchen Wert die Variable am Ende der Schleife hat ;-)
Die Frage mit dem MouseEvent kommt daher, das ich nicht genau weiss wie das "getSelectedRow" realisiert wird, bzw. wie die Selektion funktioniert, reicht es wenn ich in der JTable den Wert "markiere" oder muss ich da mit einem Event arbeiten?!!?
Die Frage ist, willst Du auf irgendein Ereignis reagieren (der Anwender klickt auf eine Zelle)? Dann musst Du einen Listener an der Komponente registieren. Oder reagierst Du bereits auf ein Ereignis (z.B. Buttonklick). Jedenfalls liefert getSelectedRow() die aktuell selektierte Zeile einer JTable bzw. -1 wenn keine Zeile selektiert ist.
z.B. Anwender drückt Löschen-Button --> actionPerformed(...) wird aufgerufen (den ActionListener zum Buttton musst Du natürlich selbst implementieren). In dieser Methode kannst Du dann die Table nach der aktuell selektierten Zeile fragen und diese per remove... aus dem Model löschen (Achtung TableIndex kann != ModelIndex sein s. JTable#convertRowIndexToModel(int))
 
Hallo,

ja ich möchte in meiner Tabelle (quasi die ausgelesene Mysql Tabelle) selektieren und anschließend die selektierte Zeile löschen!
Im zweiten step sollten dann auch Daten bearbeitet werden können!!!
 
ich habe es nochmal so versucht, aber auch da bekomme ich immer einen Rowindex von "0"

Java:
	public void mouseClicked(MouseEvent arg0) {
		
			rowIdx = jtView.getSelectedRow();		
		
	}
 
na das ist doch schonmal ein Fortschritt ;D allerdings ist das immer die erste Zeile, ich muss trotzdem irgendwie die aktuell in der Tabelle selektierte Zeile (den Index davon) ausgeben.

Aber das direkte Ausgeben der aktuell selektierten Row, funzt leider noch nicht...
Was fehlt denn da noch?!?

Muss ich mit einer Zählschleife erst die gesamte Tabellle durchgehen, das wäre doch dann sinnlos!??!?

HILFEEEEE ;D
 
getSelectedRow liefert die erste selektierte Zeile einer JTable, warum bei Dir immer 0 zurückgeliefert wird, kann unzählige Gründe haben, die an unterschiedlichsten Stellen in Deinem Code liegen können.
 

Neue Themen


Zurück
Oben