JTable 2 Fragen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • JTable 2 Fragen

    Hi,

    ich habe ein JTable das ich mit einem DefaultTableModel beschicke, das ganze klapt auch schon ganz gut, aber ich hab da 2 Schönheitsfehler:

    1. Derzeit kann man zur Laufzeit in dem JTabel rum schreiben. D.h. man kann einen Eintrag doppelt anklicken und dann einfach ändern. Wie stell ich das ab? Wie setze ich das Dingen schreibgeschützt? Die einzige Möglichkeit die ich gefunden habe ist mit "JTable.setEnable(false);", bloß dann kann ich auch keinen Eintrag mehr selektieren / markieren, das soll aber weiterhin möglich sein.

    2. Wie selektiere / markiere ich eine bestimmte Zeile? Klar, ich kann zur laufzeit drauf klicken, aber das ist nur die eine Hälfte. Ich will auch nach Einträgen suchen und diese dann markieren lassen. Es gibt "JTable.selectAll()", das sind mir aber ein paar zu viele, ich will einzelne Zeilen markieren können.
    EDIT: Ok, 2. hat sich gerade gelöst! Es gibt "JTabel.addRowSelectionInterval(int, int);" und "JTable.removeRowSelectionInterval(int, int);". Aber das erste Problem hab ich immernoch nicht gelöst.

    TIA
    Look

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Lookbehind ()

  • ???

    Versteh ich nicht ganz!
    Die Methode ".isCellEditable(int row, int colum);" liefert mir lediglich ein Boolean zurück ob die Zelle editierbar ist oder nicht, eine Methode die diesen Zustand ändert finde ich aber nicht.

    btw, der Link funktioniert nicht. (Edit: hab ihn mir zurecht gekürzt, geht jetzt, so ganz verstehen tu ich das trotzdem nicht!)

    TIA
    Look

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Lookbehind ()

  • Moin,

    Wenn Du mit einer JTable arbeitest, solltest Du immer ein TableModel verwenden.
    Dieses Model implementiert die Methode isCellEditable(), mit welcher bestimmt wird, ob eine Zelle editierbar ist oder nicht.
    Das bedeutet, dass Du in dem Model die Methode überschreibst (mit Rückgabewert false) und dieses Model dann Deiner Tabelle übergibst.
    Denn es gibt für die JTable keine "direkte" Funktion, mit der man die Editierbarkeit ändern kann.
    Deshalb musst Du das ganze Problem über das TableModel lösen...

    Das Beispiel aus meinem Link:

    Quellcode

    1. class MyTableModel extends AbstractTableModel {
    2. [...]
    3. public boolean isCellEditable(int row, int col) {
    4. if (col < 2) {
    5. return false; // Spalten 1 & 2 sind gesperrt
    6. } else {
    7. return true; // Die restlichen Spalten sind editierbar
    8. }
    9. }
    10. }
    Alles anzeigen


    Dieses Model übergibst Du dann Deiner Tabelle mit:

    Quellcode

    1. JTable table = new JTable(new MyTableModel());


    Dann übernimmt die Tabelle die isCellEditable()-Methode des Models und wendet diese halt an.
    Ich hoffe das war nun um einiges verständlicher.

    Gruß,
    Puni

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Puni ()

  • Sorry das ich mich erst jetzt wieder melde, bin die letzte Woche nicht dazu gekommen weiter zu machen.

    Also, erstmal DANKE! Es funktioniert!

    Was ich nur nicht ganz verstehe, ich habe hier mit ".isCellEditable(int, int)" eine Methode die mir, laut Klassenbibliothek, lediglich zurück liefert ob eine Zelle editierbar ist oder nicht, diesen Zustand aber nicht ändert und das auch nicht kann. Quasi eine Abfrage, bevor ich das ändern will, schnell nochmal nach fragen ob das überhaupt geht.
    Nun scheint mir diese Methode aber auch gleichzeitig eine Vorgabe zu sein ob die Zelle editierbar ist.
    Welche meiner Vorstellungen ist denn nun richtig? Ich bin verwirrt!

    THX
    Look
  • Moin,

    Du hast das schon korrekt erkannt, diese Methode gibt Dir zurück, ob der besagte Bereich (Reihe, Spalte, Zelle) als editierbar gesetzt ist oder nicht.
    Demnach musst Du vorher bestimmen, wann Editierbarkeit vorliegen soll.

    Nachträgliches Ändern ist mir nicht geläufig, zumindest denke ich dass man das immer im Vornherein festlegen muss.

    Gruß,
    Puni
  • Puni schrieb:

    Moin,

    Du hast das schon korrekt erkannt, diese Methode gibt Dir zurück, ob der besagte Bereich (Reihe, Spalte, Zelle) als editierbar gesetzt ist oder nicht.
    Demnach musst Du vorher bestimmen, wann Editierbarkeit vorliegen soll.

    Nachträgliches Ändern ist mir nicht geläufig, zumindest denke ich dass man das immer im Vornherein festlegen muss.

    Gruß,
    Puni

    Ja, aber irgendwann muss ich das doch mal definieren, ob der jetzt editierbar ist oder nicht... Wo hab ich das denn dann gemacht, wenn ".isCellEditable" mir nur das Ergebnis davon liefert?

    Egal, da mach ich mir mal n andern mal n Kopf drüber, draußen is schönes Wetter!
  • Also ... mal verständlich:

    Das TableModel ist das Gerüst der JTable. Auf dem TableModel baut alles auf.
    Was bedeutet, dass die Tabelle auf die Methoden des Models zurückgreift.
    Und mit diesen Methoden bestimmst Du das Verhalten Deiner Tabelle.

    isCellEditable(int,int) legt also fest, in wieweit die Tabelle editierbar ist oder halt nicht.

    Deshalb gibt es ja auch das bekannte Model-View-Controller (MVC) Konzept.
    Dadurch ist gewährleistet, dass Du nicht mehr direkt mit der Tabelle kommunizieren musst,
    sondern einfach nur mit dem Model arbeitest.
    In dem Model kannst Du nunmal alle tabellenrelevanten Informationen ablegen (Headeranzahl, Headernamen, Zeilenanzahl, Spaltenanzahl, etc...).
    Diese werden dann automatisch von Deiner Tabelle angewendet, ohne dass Du diese jemals modifiziert hast.

    Also nun zwei Beispiele für Deine isCellEditable-Methode:

    Annahme 1 - Spalte 1 allein soll editierbar sein:

    Quellcode

    1. public boolean isCellEditable(int row, int col) {
    2. if (col == 1) {
    3. return true;
    4. } else {
    5. return false; // alle anderen sind gesperrt
    6. }
    7. }


    Annahme 2 - Zelle [45,30] soll gesperrt sein

    Quellcode

    1. public boolean isCellEditable(int row, int col) {
    2. if (row == 45 && col == 30) {
    3. return false;
    4. } else {
    5. return true; // alle anderen sind editierbar
    6. }
    7. }


    DU musst also über das TableModel bestimmen, wann und wie etwas editierbar ist.
    Ich hoffe, es ist jetzt irgendwie verständlich *g*
  • Ok, die Erklärung war zwar etwas am Ziel vorbei, aber ich denke ich habs trotzdem verstanden.

    Die JTable ruft in dem Moment wo ich eine Zelle anklicke die Methode ".isCellEditable" auf und erlaubt dann je nach Antwort dieser Methode das editieren, oder auch nicht.
    ".isCellEditable" dient also nicht dem Überprüfen ob die Zelle editierbar ist (auf seiten des Anwenders) sondern zum festlegen ob...

    Nachträgliches ändern der Eigenschaft ist übrigens garnicht so schwer:

    Quellcode

    1. boolean cellEdit = false
    2. ...
    3. MyTableModel = new DefaultTableModel(titel, 10){
    4. public boolean isCellEditable(int row, int col){
    5. return cellEdit;
    6. }
    7. };
    8. ...
    9. if(irgendwas){cellEdit = true;}
    10. ...


    Vielen Dank für die Hilfe und die ausführlichen Erklärungen!