Toon posts:

JAVA : JTable's en een TableModel kolom editable zetten

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb het volgende probleem waarbij ik niet weet hoe ik dit netjes kan oplossen.

Ik heb een Applicatie gemaakt die met verschillende JTable werk. Om dit nu goed af te laten handelen heb ik mijn eigen MyTablemodel geschreven. Nu zou ik echter voor sommige kolommen ervoor willen zorgen dat deze niet editable zijn.

Na wat research op internet weet ik dat ik de isCellEditableTableUsers van mijn tablemodel kan overschrijven en daardoor kan bepalen wat editable is en niet. Dit werk goed.

alleen nu heb ik meerdere tablelen die gebruik maken van dit tablemodel en sommige moeten die kolom wel editable en andere weer niet. Een oplossing zou zijn zeer veel eigen tablemodels te schrijven maar dit komt de schaalbaarheid niet ten goede.

Nu vraag ik me dus af of mogelijk is om bijvoorbeeld een methode te schrijven setEditableColum(int i) die dan dit voor mij aanpast. Op internet heb ik nammelijk alleen voorbeelden kunnen vinden die die voor al mijn tabellen regelen ;( .

  • netvor
  • Registratie: September 2000
  • Laatst online: 08-04-2024
Zet in je tablemodel een public void setEditableColumn(int newEditableColumn) en wellicht een private int currentEditableColumn;
Als die wordt aangeroepen stelt hij zichzelf bij, d.w.z. de oude kolom (currentEditableColumn) wordt uneditable, en de nieuwe kolom (newEditableColumn) wordt editable.

Zo kan je het per tablemodel aanpassen. Maak voor elke JTable een nieuwe instance van je TableModel aan en bewaar de reference ergens, bijvoorbeeld in een HashMap<JTable,MyTableModel>. Wanneer je je JTable wilt aanpassen zoek je het bijbehorende tablemodel op en roep je de method aan.

Twee bedenkingen heb ik hier nog bij:
1) Die HashMap heb je misschien niet nodig. Volgens mij is er zoiets als JTable.getTableModel() oid.

2) Als je je data in het model hebt zitten, dan worden wijzigingen in instance X van het model natuurlijk niet doorgevoerd in instance Y. Je moet in dat geval je model herschrijven zodat het een reference naar een centrale datasource heeft. Die datasource zou ik dan wel thread-safe maken, voor het geval dat de models die er data instoppen en uithalen in verschillende threads lopen.

Computer Science: describing our world with boxes and arrows.


Verwijderd

Topicstarter
imp schreef op dinsdag 08 augustus 2006 @ 09:50:
Zet in je tablemodel een public void setEditableColumn(int newEditableColumn) en wellicht een private int currentEditableColumn;
Als die wordt aangeroepen stelt hij zichzelf bij, d.w.z. de oude kolom (currentEditableColumn) wordt uneditable, en de nieuwe kolom (newEditableColumn) wordt editable.
Ja dit had ik dus ook al gedacht ik had een public void setUserTableEditable(int column) maar dan weet ik niet hoe ik ervoor kan zorgen dat hij de huidige setting van editable overschrijft.

iets verwachten iets in de trend van this.SetEditable(1); // set de colum editable

dan zou ik daarna dus in mijn gui het volgende kunnen doen.

tablemodel.setUserTableEditable(1);
table.revalidate;
[Zo kan je het per tablemodel aanpassen. Maak voor elke JTable een nieuwe instance van je TableModel aan en bewaar de reference ergens, bijvoorbeeld in een HashMap<JTable,MyTableModel>. Wanneer je je JTable wilt aanpassen zoek je het bijbehorende tablemodel op en roep je de method aan.

Twee bedenkingen heb ik hier nog bij:
1) Die HashMap heb je misschien niet nodig. Volgens mij is er zoiets als JTable.getTableModel() oid.

2) Als je je data in het model hebt zitten, dan worden wijzigingen in instance X van het model natuurlijk niet doorgevoerd in instance Y. Je moet in dat geval je model herschrijven zodat het een reference naar een centrale datasource heeft. Die datasource zou ik dan wel thread-safe maken, voor het geval dat de models die er data instoppen en uithalen in verschillende threads lopen.
Ik heb nu een grote table tableData en ik heb ongeveer 10 tablemodels en verander steeds deze modellen als er andere data in de tabel moet komen. Ik heb dus instanties gemaakt van mijn models en weet deze ook dus denk niet dat ik hasmap nodig heb.

Mijn centrale datasource? dit volg ik even niet ik voer nu trouwens de wijziging op mijn server uit middels RMI en doe vervolgens mijn tablemodel update en dan mijn table revalidate.

Wat betreft threads safe je bedoelt voer het uit in een aparte thread zodat niet je hele applicatie gaat vastlopen als er wat mis gaat?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 13:48

Robtimus

me Robtimus no like you

Je kan aan een TableColumn een CellEditor assignen. Standaard gebruikt deze een DefaultCellEditor met daarin een JTextField (of JCheckBox als het table model voor die kolom de Boolean class returned).
Wat je dus kan doen is een nieuwe DefaultCellEditor creeren, met als parameter een nieuwe JTextField. Dit JTextField kan je non-editable maken dmv setEditable(false).

Zo haal je het editable zijn dus uit de TableModel en verplaats het naar de JTable en TableColumn.

More than meets the eye
There is no I in TEAM... but there is ME
system specs