Probleme mit einem JTable

jorgeHX

Erfahrenes Mitglied
Schönen guten Morgen,
ich habe ein kleines Problem bei dem ich im Moment nicht weiter weiß.

Ich habe eine JTable gefüllt mit den Monatszahlen. Als Tablemodel habe ich ein eigenes formuliert. Zu Beginn werden auch alle Zahlen genau so angezeigt wie ich das möchte.
Klicke ich dann allerdings in die Tabelle so verändern sich alle Werte.

Es erscheint so, als wenn die Methode "public Object getValueAt(int rowIndex, int columnIndex)" aus meinem Tablemodel erneuert aufgerufen wird.
Ich möchte aber, dass sich nichts ändert.
Das muss doch möglich sein, oder?

Schon jetzt vielen Dank falls jemand eine Idee hat.
ciao
 
Original geschrieben von jorgeHX
Schönen guten Morgen,
ich habe ein kleines Problem bei dem ich im Moment nicht weiter weiß.

Ich habe eine JTable gefüllt mit den Monatszahlen. Als Tablemodel habe ich ein eigenes formuliert. Zu Beginn werden auch alle Zahlen genau so angezeigt wie ich das möchte.
Klicke ich dann allerdings in die Tabelle so verändern sich alle Werte.

Es erscheint so, als wenn die Methode "public Object getValueAt(int rowIndex, int columnIndex)" aus meinem Tablemodel erneuert aufgerufen wird.
Ich möchte aber, dass sich nichts ändert.
Das muss doch möglich sein, oder?

Schon jetzt vielen Dank falls jemand eine Idee hat.
ciao

Moin,
Du musst Dir lediglich ein Datenkonstrukt oder eine Implementierung von

getValueAt(int rowIndex, int columnIndex)

so basteln, dass Du das gewünschte Verhalten erhältst. getValueAt(int rowIndex, int columnIndex) wird jedenfalls sehr oft aufgerufen, so dass eine saubere Implementierung zwingend erforderlich ist.
 
Moin Snape,
also ich poste mal mein TableModel, vielleicht siehst du ja wo ich was falsch mache:


public class KalenderUebersichtModel extends AbstractTableModel {

int rows = 7;
int columns = 7;
int mm;
String monthYear;
int yy;
int leadSpace = 0;
int tag = 0;

// liste Namen der Woche auf
public final static String[] shortDays = {
"M", "D", "M", "D", "F", "S", "S"
};

public final static int diM [] = {
31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31
};


public KalenderUebersichtModel(String monthYear, int mm, int yy) {
this.monthYear = monthYear;
this.mm = mm;
this.yy = yy;

}


public int getRowCount() {
return rows;
}

public int getColumnCount() {
return columns;
}

public String getColumnName(int columnIndex) {
switch (columnIndex) {
default:
return " ";
}
}

public Object getValueAt(int rowIndex, int columnIndex) throws Exception {
// erzeuge einen neuen Calendar mit den übergebenen Werten für Jahr und Monat
GregorianCalendar cal = new GregorianCalendar(yy, mm, 1);
leadSpace = cal.get(Calendar.DAY_OF_WEEK);

if (leadSpace == 1) {
leadSpace = leadSpace + 5;
}
else {
leadSpace = leadSpace - 2;
}
int daysInMonth = diM[mm];

if (cal.isLeapYear(cal.get(Calendar.YEAR)) && mm == 1) {
++daysInMonth;
}

switch (rowIndex) {
case 0:
return shortDays[columnIndex];
case 1:
if (columnIndex < leadSpace) {
// mache nichts
return null;
}
tag++;
return String.valueOf(tag);
case 2:
tag++;
return String.valueOf(tag);
case 3:
tag++;
return String.valueOf(tag);
case 4:
tag++;
if (tag > daysInMonth) {
return null;
}
return String.valueOf(tag);
case 5:
tag++;
if (tag > daysInMonth) {
// nur im Schaltjahr möglich
return null;
}
return String.valueOf(tag);
case 6:
tag++;
if (tag > daysInMonth) {
return null;
}
return String.valueOf(tag);
default:
System.out.println("Default");
return null;
}
//return null;
}
}

Wäre sehr schön, da ich echt nicht weiß, wo ich den Fehler mache.
Danke
 
Tach,
hab keine Zeit mich da näher reinzudenken, aber das sieht schon merkwürdig aus. Zwei Dinge sind mir aufgefallen:
1. Der GregorianCalender ist unabhängig von row und column, d.h. die Berechnung/Erzeugung sollte ausserhalb der getValueAt stattfinden.
2. Du hantierst mit der Instanzvariablen tag fröhlich herum. Prüf das Verhalten mal nach. Beachte dabei, dass getValueAt nicht Reihe für Reihe und Spalte für Spalte immer schön nacheinander aufgerufen wird.

Bist Du schon mal mit dem Debugger hineingesteppt?

BTW getValueAt aus dem TableModel wirft keine Exception... also raus mit "throws Exception"
 
Morgen Snape,
deine Ideen war alle richtig. Das Problem lag daran, dass ich mit der Variable Tag rumgespielt habe, aber eigentlich die columnIndex und rowIndex in die Berechnung der Inhalte einer Zelle miteinbeziehen musste. Na ja egal, jetzt das wenigstens :-)

Was mich allerdings auf ein weiteres Problem gestoßen hat.
1. Klicke ich auf eine Zahl, so wird die gesamte Zeile markiert. Das kann ich aber wohl mit dem SelectionMode einstellen. Das Problem, das sich ergibt, wenn ich die Methode setCellSelection(false) aufrufe, ist, dass die ausgewählte Zelle nur so lange markiert ist, wie ich mich in derselben Tabelle befinde. Klicke ich in eine andere Tabelle, so verschwindet die Auswahl. Ist setCellSelection(true), dann ist zwar die gesamte Zeile ausgwählt, aber diese bleibt zumindest ausgewählt, auch wenn ich in eine andere Tabelle springe. Gibt es da nicht ein Zwischending? Also dass die eine Zelle ausgewählt bleibt, wenn ich in eine andere Tabelle klicke?

2. wenn ich mit den Pfeiltasten durch die Tabelle gehe, so springt der slektierte Bereich nicht automatisch eine Zeile tiefer, sobald ich am Ende der darüberliegenden Zeile angekommen bin. Muss ich da noch was aktivieren oder so?

3. Ist es möglich, von einer Tabelle direkt in eine nächste Tabelle zu gelangen, wenn man mit den Pfeiltasten durch eine Tabelle streift und am Ende der ersten Tabelle angelangt ist? So könnte ich dann z.B. in meinem Beispiel von der Tabelle August in die Tabelle September springen ohne die Maus benutzt zu haben.

Falls jemand Zeit und Lust hast, wäre es super Ideen zu hören. Ich tüftel jetzt erstmal weiter :-)
Danke
 
Zuletzt bearbeitet:
Zurück