Java: JTable nicht verändern oder Änderung merken

Squicky

Lt. Commander
Registriert
Sep. 2002
Beiträge
1.404
hallo

Ich habe eine Tabelle:
Der Benutzer soll Einträge in dieser Tabelle verändern dürfen. Diese Veränderung soll aber das Programm merken, damit dies überprüft und bearbeitet werden.
Ich habe zwei Lösungsanzätze (bei beiden komme ich nicht weiter):
1. Der Benutzer macht einen Doppelklick auf einen Eintrag in der Tabelle und bearbeitet diesen.
Wie kann ich/das Programm diese Änderung abfangen, prüfen ob die Änderung erlaubt ist (z.B. dürfen nur Zahlen eingegeben werden) und dann diese Daten verwerfen oder bearbeiten.
2. Der Benutzer darf die Daten in der Tabelle nicht direkt ändern. Er markiert eine Zeile und klick dann auf einen "Button" ändern.
Wie kann man die Tabelle so einstellen, dass der Benutzer die Daten mit einem Doppelklick nicht ändern darf?


private void Tabelle()
{
String[][] rowData = { { "Japan", "245" }, { "USA", "240" },
{ "Italien", "220" }, { "Spanien", "217" },
{"Türkei", "215"} ,{ "England", "214" },
{ "Frankreich", "190" }, {"Griechenland", "185" },
{ "Deutschland", "180" }, {"Portugal", "170" } };
String[] columnNames = { "Land", "Durchschnittliche Fernsehdauer pro Tag in Minuten" };

JTable table = new JTable( rowData, columnNames );

table.setSelectionMode(0); //nur eine Zeile markieren
JScrollPane test_Tabelle = new JScrollPane( table );
test_Tabelle.setBounds(10, 80, 400, 100);
add(test_Tabelle);

}
 
Nabend,

also ein paar kleine Hinweise kann ich dir schonmal geben.
Den ersten Lösungsansatz müsstest du wahrscheinlich über den TableModelListener des DefaultTableModels des JTables realisieren können. Der liefert dir immer ein Event wenn eine Zelle verändert wurde mit samt der Position der geänderten Zelle.
Evtl. kannst du das auch direkt über das TableModel ohne den Listener machen aber ich bin mir im Moment nicht ganz sicher wie.

Den zweiten Lösungsansatz könntest du umsetzen in dem du den JTable deaktivierst (table.setEnabled(false); ). Unter umständen schaltest du damit aber zuviel Funkttionalität ab.
Ansonsten kannst du das über's TableModel umsetzen.

Auf jeden Fall solltest du deine Implementierung etwas mehr JAVA-mäßig gestallten. Soll heißen Daten und GUI von einander trennen (Stichwort DefaultTableModel).

Ich hoffe ich konnte dir damit ein wenig helfen! Ich bin leider erst morgen (naja genau genommen doch heute) wieder an dem Rechner mit meiner Entwicklungsumgebung. Wenn du dann noch Hilfe brauchst kann ich dir auch Quelltexttechnisch ein wenig auf die Sprünge helfen.

Dann noch viel Glück beim basteln und gute nacht
 
Hallo

Habe es mit der ersten Möglichkeit gelöst:
implements TableModelListener
...
public void tableChanged(TableModelEvent e)
{
int x = e.getFirstRow();
int y = e.getColumn();
System.out.println(new Integer(x).toString()+" "+new Integer(y).toString());
System.out.println(rowData[x][y]);
}

Um einen Eintrag in Tabelle zu ändern, muss man auf eine Zelle doppelklicken. Dann kann man den Wert ändern, und wenn man dann die Zelle verlässt, fängt man diese Änderung mit dem tableChanged ab.
Gibt es eine Möglichkeit den doppelklick in eine Zelle abzufangen. Denn ich möchte den Wert bevor er geändert wird zwischen speichern. Denn wenn der neue geänderte Wert nicht erlaubt ist (z.B. Buchstaben, wenn nur Zahlen erlaubt sind), dann so der alte Wert widerhergestellt werden.
 
Die Daten sind doch noch in deinem Model. Die Änderungen in der Zelle übernimmst Du erst, nachdem Du die Eingabe validiert hast. Generell solltest du sowieso Model und View in separate Klassen stecken und nur über Events kommunizieren (MVC-Pattern).
 
Zurück
Oben