AbstractTableModel - setValueAt - Wert übergeben

Hallo, ich brauche Hilfe, suche mir hier einen Wolf.

Ich habe ein AbstractTableModel das Daten aus einer Oracle Datenbank liefert. Funktioniert auch prima. Allerdings scheitere ich beim Versuch einen Wert in der JTable zu ändern.

Meine Frage ist, was muss ich hier an setValueAt übergeben (Bitte Beispiel)

Hier ist mein AbstractTableModel:

Java:
public class FillTable extends AbstractTableModel{

	private ResultSet rs;
	private int rowCount;
	private int columnCount;
	private ArrayList data=new ArrayList();
	Object[][] contents;
	
	public FillTable(ResultSet _rs) throws Exception
	{
		setRS(_rs);
	}

	public void setRS(ResultSet _rs) throws Exception {
		this.rs=_rs;
		ResultSetMetaData metaData=_rs.getMetaData();
		rowCount=0;
		columnCount=metaData.getColumnCount();
		while(_rs.next()){
			Object[] row=new Object[columnCount];
			for(int j=0;j<columnCount;j++){
				row[j]=_rs.getObject(j+1);
			}
			data.add(row);
			rowCount++;
		}
	}

	public int getColumnCount(){
		return columnCount;
	}

	public int getRowCount(){
		return rowCount;
	}

	public Object getValueAt(int rowIndex, int columnIndex){
		Object[] row=(Object[]) data.get(rowIndex);
		return row[columnIndex];
	}

	
	public void setValueAt(Object value, int row, int col) {
		contents[row][col] = value;
		fireTableCellUpdated(row,col);

	}
	
	
	public String getColumnName(int columnIndex){
		try{
			ResultSetMetaData metaData=rs.getMetaData();
			return metaData.getColumnName(columnIndex+1);
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
}
 

Mujahiddin

Top Contributor
Hallo.
Erstens solltest du Generics verwenden bei deiner ArrayList, zweitens solltest du alle ArrayList durch List ersetzen.

Drittens:
Du bist inkonsistent mit deiner Implementierung:
Du hast ein zweidimensionales Array von Object, das bei
Code:
setValueAt
geändert wird, und bei
Code:
getValueAt
gibst du einen Wert zurück, der in irgendeiner Liste liegt... Das leuchtet mir nicht ein!

Ich würde eher deine Methode
Code:
setRS
folgendermaßen implementieren. (außer du willst beim ArrayList bleiben):

Java:
public void setRS(ResultSet _rs, int size) throws Exception {
	this.rs=_rs;
	ResultSetMetaData metaData=_rs.getMetaData();
	rowCount=0;
	columnCount=metaData.getColumnCount();
	contents = new Object[size][];
	while(_rs.next()) {
		Object[] row=new Object[columnCount];
		for(int j=0;j<columnCount;j++){
			row[j]=_rs.getObject(j+1);
		}
		contents[rowCount++] = row;
	}
}

oder deins beibehalten und
Code:
setValueAt
ändern, wovon ich denke, dass es dir eher zusagen wird:

Java:
public void setValueAt(Object value, int row, int col) {
	data.get( row )[ col ] = value;
	fireTableCellUpdated(row,col);
}

Beim dieser Variante kannst du deine contents-Variable löschen ( bei der anderen hingegen die data-Variable)

VIERTENS:
statt
Code:
throws Exception
lieber
Code:
throws SQLException
, es ist schlechter Stil, immer auf Exception zurückzugreifen, wenn es nicht nötig ist.
 
Zuletzt bearbeitet:
Habe mal die Variante setValueAt nach deinem Vorschlag geändert.

... wenn ich das hier verwende bekomme ich einen Fehler,

Hallo.

oder deins beibehalten und
Code:
setValueAt
ändern, wovon ich denke, dass es dir eher zusagen wird:

Java:
public void setValueAt(Object value, int row, int col) {
	data.get( row )[ col ] = value;
	fireTableCellUpdated(row,col);
}

Beim dieser Variante kannst du deine contents-Variable löschen ( bei der anderen hingegen die data-Variable)


und dieser Fehler lautet: The type of the expression must be an array type but it resolved to Object
 

Mujahiddin

Top Contributor
Wie gesagt,
Code:
ArrayList
durch
Code:
ArrayList<Object[]>
ersetzen und
Code:
ArrayList<Object[]>
durch
Code:
List<Object[]>
(außer bei
Code:
new ArrayList<Object[]>()
)!!

@mla.rue, weil das gegen Interface-Programmierung verstößt. Für gewöhnlich braucht keiner die speziellen Methoden der ArrayList, eine List genügt. Sollte man sich übrigens irgendwann entscheiden, die Implementierung von
Code:
ArrayList
zum Beispiel auf
Code:
LinkedList
zu ändern, hat man viel mehr Schwierigkeiten. Interfaces sind nicht umsonst da!
 
Zuletzt bearbeitet:
Wie gesagt,
Code:
ArrayList
durch
Code:
ArrayList<Object[]>
ersetzen und
Code:
ArrayList<Object[]>
durch
Code:
List<Object[]>
(außer bei
Code:
new ArrayList<Object[]>()
)!!

Java:
 private ArrayList data=new ArrayList();

ändern in .....

Java:
 private ArrayList<Object[]> data=new ArrayList();
 

Mujahiddin

Top Contributor
Nein!
Java:
private List<Object[]> data = new ArrayList<Object[]>(); // oder "new ArrayList<>();" ab Java 7
 
Wie gesagt,
Code:
ArrayList
durch
Code:
ArrayList<Object[]>
ersetzen und
Code:
ArrayList<Object[]>
durch
Code:
List<Object[]>
(außer bei
Code:
new ArrayList<Object[]>()
)!!

habe jetzt aber noch eine Frage zu deinem Vorschlag:

Java:
public void setRS(ResultSet _rs, int size) throws Exception {
    this.rs=_rs;
    ResultSetMetaData metaData=_rs.getMetaData();
    rowCount=0;
    columnCount=metaData.getColumnCount();
    contents = new Object[size][];
    while(_rs.next()) {
        Object[] row=new Object[columnCount];
        for(int j=0;j<columnCount;j++){
            row[j]=_rs.getObject(j+1);
        }
        contents[rowCount++] = row;
    }
}


Dann muss ich aber auch hier ein "int" mitgeben...

Java:
public FillTable(ResultSet _rs) throws Exception
{
	setRS(_rs);
}


wie würde das dann aussehen ?
 

Mujahiddin

Top Contributor
Kommt drauf an, wie du dein ResultSet holst, aber im Normalfall müsstest du eine weitere Anfrage an deine Datenbank senden um
Code:
COUNT(*)
zu ermitteln. Also etwa so:
Java:
ResultSet rs = ... // dein rs eben
ResultSet count = connection.createStatement().executeQuery("SELECT COUNT(*) FROM Table");
if(!count.next())
	System.err.println("Sollte nie vorkommen");
int size = count.getInt( 1 );
new FillTable(rs, size);
 
Zunächst noch einmal Danke ! Du hast mir schon sehr geholfen.

Aber um deine Frage zu beantworten:

Kommt drauf an, wie du dein ResultSet holst, aber im Normalfall müsstest du eine weitere Anfrage an deine Datenbank senden um
Code:
COUNT(*)
zu ermitteln. Also etwa so:
Java:
ResultSet rs = ... // dein rs eben
ResultSet count = connection.createStatement().executeQuery("SELECT COUNT(*) FROM Table");
if(!count.next())
	System.err.println("Sollte nie vorkommen");
int size = count.getInt( 1 );
new FillTable(rs, size);

Ich hole mein ResultSet wie folgt:

Java:
	public static FillTable myModel() throws Exception{
		String DriverClass = null;
		if(getDriverClass() != null) {
			DriverClass = getDriverClass();
		} else {
			DbHostDbaCon myDbHostDbaCon = new DbHostDbaCon(getDataBaseName());
			DriverClass = myDbHostDbaCon.getDriverClass();
		}
		try {
				Class.forName (DriverClass);
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
		}
				
		java.sql.Statement st = HostCon.createStatement();

		ResultSet rs = st.executeQuery(StrSql);
		FillTable model = new FillTable(rs);
		return model;
	}

Wenn ich davor ein Select Count(*) absetze, wie müsste dann dieses ResultSet abgehoöt werden ? Kannst du mir das so umbauen, wie von dir beschrieben ?
 

Mujahiddin

Top Contributor
Java:
ResultSet rs = st.executeQuery(StrSql);
ResultSet count = st.executeQuery("SELECT COUNT(*) FROM " + StrSql);
if(!count.next())
    System.err.println("Sollte nicht passieren");
int size = count.getInt( 1 );
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Erste Schritte AbstractTableModel Werte setzen mit setValueAt Java Basics - Anfänger-Themen 10
J JTable abstractTableModel delete Row Java Basics - Anfänger-Themen 4
K JTable AbstractTableModel Header setzen Java Basics - Anfänger-Themen 6
C AbstractTableModel Spalten-Namen Java Basics - Anfänger-Themen 3
G Datenspeicherung im AbstractTableModel Java Basics - Anfänger-Themen 14
S Konstruktor von AbstractTableModel mit jTable Java Basics - Anfänger-Themen 3
R Problem mit AbstractTableModel oder Array! Java Basics - Anfänger-Themen 5
B getEditingRow() in AbstractTableModel ? Java Basics - Anfänger-Themen 2
B JTable / AbstractTableModel Java Basics - Anfänger-Themen 6
Z TableModel Methode setValueAt Java Basics - Anfänger-Themen 9
B problem mit tabel.setValueAt Java Basics - Anfänger-Themen 5
G setValueAt Rückgabewert verarbeiten? Java Basics - Anfänger-Themen 12
richis-fragen JTable den angezeigten WERT nicht den Wert aus dem Model ausgeben. Java Basics - Anfänger-Themen 3
A Negativ-Wert Java Basics - Anfänger-Themen 4
R finaler Wert in outerMethod von method in InnerMethodClass Java Basics - Anfänger-Themen 2
FunkyPhil94 Wert in einer Lambda Funktion erhöhen Java Basics - Anfänger-Themen 3
T Datum als Variable wert Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
Ostkreuz Wert von Arrays summieren Java Basics - Anfänger-Themen 1
J Array Mittleren Wert bestimmen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
K Java gleicher Wert von Zahlen? Java Basics - Anfänger-Themen 5
M Erste Schritte While Schleife / Ausgabe von buchstabe & ASCII Wert Java Basics - Anfänger-Themen 4
M Spezifischen Wert einer Zeile aus .txt Datei entnehmen Java Basics - Anfänger-Themen 15
M Dialogbox solange abfragen, bis gültige Wert-Eingabe Java Basics - Anfänger-Themen 12
S Runden auf den niedrigsten Wert Java Basics - Anfänger-Themen 10
volcanos enum und switch (neu): falschen Wert mit IllegalArgumentException oder mit EnumConstantNotPresentException abfangen ? Java Basics - Anfänger-Themen 51
F Wie kann ich eine Funktion schreiben, die nur in bestimmten Fällen einen Wert zurückgibt? Java Basics - Anfänger-Themen 5
T Mit jedem Wert in der for-Schleife weiter arbeiten Java Basics - Anfänger-Themen 3
xaerez Threads Boolean Wert verändert sich nicht Java Basics - Anfänger-Themen 5
xaerez Threads Boolean Wert verändert sich nicht Java Basics - Anfänger-Themen 4
java-starter Erste Schritte Eingabe in Char wert umwandeln Java Basics - Anfänger-Themen 7
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
sserio TXT-Datei Auslesen und den Wert jedes Namen ausrechnen etc. Java Basics - Anfänger-Themen 37
M Warum return die Methode den Wert nicht Java Basics - Anfänger-Themen 5
I Historisierung - Alter Wert, Neuer Wert... wie speichern? Java Basics - Anfänger-Themen 44
J Wert in Dropdown Menü kursiv schrieben Java Basics - Anfänger-Themen 19
H Uhrzeitespanne in Integer Wert umrechnen Java Basics - Anfänger-Themen 1
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
M Wie kann die Implementation einer Methode den Wert eines Attributs vermindern? Java Basics - Anfänger-Themen 3
M Wie kann ich festlegen, dass ein Attribut maximal den Wert 0 erreicht, also nicht in den negativen Bereich fällt? Java Basics - Anfänger-Themen 4
M Methoden Wert einer Variable geht verloren? Java Basics - Anfänger-Themen 6
U Ascii wert verschieben, wie möglich? Java Basics - Anfänger-Themen 3
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
B in einem Array den nächstgelegenen Wert zu einem eingabewert finden Java Basics - Anfänger-Themen 8
D Einen boolischen Wert aus einer Methode in einer anderen Klasse aufrufen? Java Basics - Anfänger-Themen 11
T Algorithmus für Index mit min-Wert Java Basics - Anfänger-Themen 2
J Wert zurückgeben über get Methode Java Basics - Anfänger-Themen 8
E Slider - Wert übergeben und überschreiben Java Basics - Anfänger-Themen 5
G Input/Output getText() gibt keinen Wert! Java Basics - Anfänger-Themen 13
NaZuRe Geld(Wert) von der public static void main in die public static void Blackjack Java Basics - Anfänger-Themen 2
I Validation, ob String ein Wert aus einem Enum enthält Java Basics - Anfänger-Themen 3
J Wert in einer json Datei ändern und speichern Java Basics - Anfänger-Themen 3
S Aus verschachtelter ArrayList auf einen Wert zugreifen Java Basics - Anfänger-Themen 4
H Den Wert einer rekursiven Funktion bestimmen Java Basics - Anfänger-Themen 5
T Feststellen, dass Wert zu groß; Caesar Chiffre Java Basics - Anfänger-Themen 3
J maximaler Wert eines Integers Java Basics - Anfänger-Themen 14
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
H Methode über String Wert aufrufen Java Basics - Anfänger-Themen 8
G Rekursive Methode liefert augenscheinlich keinen boolean-Wert zurück. Java Basics - Anfänger-Themen 4
Lena_2611 Vergleich von Array1 Index mit Array2 Wert und erzeugen eines neues Arrays Java Basics - Anfänger-Themen 8
NeoLexx Abfrage mit instanceof führt zu unerwarteten Wert Java Basics - Anfänger-Themen 9
B Map<String, FilterMeta, wie Wert bekommen? Java Basics - Anfänger-Themen 4
ms_cikar Den Wert einer Hex. value bestimmten. Java Basics - Anfänger-Themen 8
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
S Integer Wert wird nicht übernommen Java Basics - Anfänger-Themen 2
V Boolean Wert nicht richtig erkannt Java Basics - Anfänger-Themen 4
H Datentypen Was für eine Format verbirgt sich hinter dem Integer-Wert 053? Java Basics - Anfänger-Themen 2
1 Array nimmt falschen Wert auf! Java Basics - Anfänger-Themen 2
S Erste Schritte Button einen Wert zuweisen & diesen ausgeben Java Basics - Anfänger-Themen 2
H Größte Duplikat (Größte Doppelte Wert) eines Arrays ausgeben Java Basics - Anfänger-Themen 9
V_Fynn03 Erste Schritte Einen Wert in ein TextField einfügen aus einer anderen Klasse Java Basics - Anfänger-Themen 3
J Wert zwischen JFrames übergeben Java Basics - Anfänger-Themen 2
J Umwandlung String zu ASCII-Wert und anders Java Basics - Anfänger-Themen 17
P Verzweigungen Wert zurück geben Java Basics - Anfänger-Themen 2
D Wert des Arrays unter Bedingungen ändern Java Basics - Anfänger-Themen 1
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
F Boolean Methode Wert ausgeben. Java Basics - Anfänger-Themen 2
X Erste Schritte boolean wert ändert sich nicht? Java Basics - Anfänger-Themen 6
T Klassen Den Wert aus Array lesen lassen Java Basics - Anfänger-Themen 12
W Problem mit dem Wert von boolean-Variable Java Basics - Anfänger-Themen 3
J Wie kann ich z.B. einem int-Wert einen String-Wert zuweisen? Java Basics - Anfänger-Themen 2
H Einfache Frage zur Punktnotation objektname.methode(wert) Java Basics - Anfänger-Themen 2
D integer negativen Wert abspeichern Java Basics - Anfänger-Themen 3
L Wert einer Webeseiteauslesen Java Basics - Anfänger-Themen 6
D Erste Schritte Wert im Array suchen Java Basics - Anfänger-Themen 12
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
S Wert innerhalb eines anderen Wertes Java Basics - Anfänger-Themen 3
S Array doppelter Wert prüfen Java Basics - Anfänger-Themen 7
O Wert in einer Schleife unterschiedlich erhöhen Java Basics - Anfänger-Themen 2
B ArrayList besitzt einen Wert zu wenig Java Basics - Anfänger-Themen 16
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
F Java int-Wert wird resetet Java Basics - Anfänger-Themen 21
J Erste Schritte Wert aus JTextField zurückgeben Java Basics - Anfänger-Themen 6
CptK Bestimmten Integer Wert aus Array filtern Java Basics - Anfänger-Themen 2
B Liste von Integer -> Nächster Wert bekommen Java Basics - Anfänger-Themen 5
J Wert bei Objekterzeugung verändern Java Basics - Anfänger-Themen 12
I bestimmten Wert eines Arrays Java Basics - Anfänger-Themen 23

Ähnliche Java Themen


Oben