Hallo Java Gemeinde,
hat vielleicht jemand ein Tipp für mich wie ich einen Zeilenwert an einer bestimmter Position ändern kann?
Im unetern Code sind schon mal einpaar Methoden definiert, wie Zugriff auf Zeilenanzahl oder Spaltenanzahl.
Die Methode ganz unten setZeilenWert funktioniert aber nicht:confused:, wie könnteman das Problem lösen?
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
public class Table extends AbstractTableModel {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Werte der Tabelle, werden intern in einer ArrayList abgelegt.
*/
private ArrayList<Object> dataValues = new ArrayList<Object>();
/**
* Überschriften der Tabelle, sind hier auch hart codiert.
*/
private String columnNames[] = { "name", "stadt", "strasse" };
/**
* Der interne Datenspeicher wird mit einigen Einträgen gefüllt.
*/
public Table() {
addTriple("Andi Arbeit", "Soest", "Terlindenweg");
addTriple("Manuel Einstellbar", "Karlsruhe", "Kaiserallee");
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
return dataValues.size();
}
/**
* Die Namen zur Darstellung der Überschriften
*/
public String getColumnName(int column) {
return (String) columnNames[column];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return ((String[]) dataValues.get(rowIndex))[columnIndex];
}
/**
* Neue Einträge in den internen Datenspeicher einfügen.
*/
public void addTriple(String name, String city, String street) {
String[] triple = { name, city, street };
dataValues.add(triple);
fireTableDataChanged();
}
public int hasColumn(String name) {
int columnIndex = 0;
for (int i = 0; i < columnNames.length; i++) {
if (name.equals(getColumnName(i))) {
columnIndex = i;
}
if (columnIndex != 0) {
break;
}
}
return columnIndex;
}
public void setZeilenWert(int row, int col, String text) {
String stringToDelete = (String) getValueAt(row, col);
System.out.println(stringToDelete + " -------");
// dataValues.s(rowIndex))[columnIndex]);
dataValues.remove(stringToDelete);
dataValues.add(text);
fireTableDataChanged();
}
}
Das private ArrayList<Object> dataValues = new ArrayList<Object>();
könnte vermutlich ein private List<String[]> dataValues = new ArrayList<String[]>();
sein, das würde einige casts sparen.
Dann sollte es mit sowas wie
public void setZeilenWert(int row, int col, String text) {
dataValues.get(row)[col] = text;
fireTableDataChanged();
}
schon getan sein.
EDIT: Ohne die Methode setValueAt(Object aValue, int rowIndex, int columnIndex)
wird das ganze aber ohnehin nicht funktionieren. Die Methode “setZeilenWert” sollte entsprechend durch die Methode “setValueAt” ersetzt werden…:
@Override
public void setValueAt(Object value, int row, int col) {
dataValues.get(row)[col] = String.valueOf(text);
fireTableDataChanged();
}
Danke!
Die erste Version hat wunderbar funktioniert
ich habe noch zusätlich einpaar Fragen wie kann ich mir am besten mit der folgenden Methode einen Zeilennamen herausholen? Anhand der Zeilennummer und dem Spaltennamen.
public String getRowName(int row, String spaltenname) {
return null;
}
und anhand der Zeilennummer und dem Spaltennamen den Zeilenwert ändern?
public void setZeilenWertAnhandSpaltenname(int row, String spaltenname, String neuerZeilenwert) {
}
Was ist ein Zeilenname? Meinst Du hier den Zellwert?
In beiden Fällen kann man mittels des Parameters spaltenname den Spaltenindex im Model bestimmen und via der zwei bereits genannten Methoden entsprechend den Wert zurückgeben bzw. ersetzen.
Die erste Version funktioniert vielleicht, wenn du diese Methode direkt aufrufst. Aber wenn an anderer Stelle die (erwartete und einzig bekannte!) Methode “setValueAt” aufgerufen wird, wird die NICHT den nötigen Effekt haben. Wenn du sie nicht implementierst, ist sie einfach leer. Ersetze deine Methode “setZeilenWert” durch die Methode “setValueAt”, und rufe. ggf. direkt “setValueAt” statt “setZeilenWert” auf.
Eine Zeile hat keinen Namen. Aber in beiden Fällen scheint es darum zu gehen, auf Basis des Spaltennamens die Spaltennummer herauszufinden, denn dann kann z.B. die angedeutete Methode “getRowName” einfach implementiert sein als
D.h. du brauchst nur die magische Funktion “getColumnIndexFor”, die GROB (ungetestet) etwa so aussehen könnte
private int getColumnIndexFor(String columnName)
{
for (int i=0; i<getColumnCount(); i++)
{
String s = getColumnName(i);
if (s.equals(columnName)) return i;
}
return -1;
}
Wobei man sich noch über Details Gedanken machen könnte und sollte - wie speziell die Frage, was passieren soll, wenn man einen Spaltennamen angibt, der NICHT in der Tabelle vorkommt…