Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Spostare righe JTable

  1. #1

    Spostare righe JTable

    Salve ragazzi, avrei un problemino.
    Ho una JTable con un tableModel da me definito.

    Quando carico la schermata, in questa tabella ci sono ad esempio 10 righe.
    PS: la tabella ha dimensione nRighe x 7 colonne.

    Vorrei poter fare in modo che le riga possano spostarsi. Ad esempio, la riga 9 deve andare al posto della riga 8 e le altre quindi devono scalare. Come posso fare ciò????

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Beh... è il tuo tablemodel che decide l'ordine in cui le righe sono visualizzate dalla JTable.
    Vuoi spostare una riga? Bene... dovrai fare in modo che si sposti nel TableModel.

    Ad esempio, supponiamo che il tuo tablemodel sia rappresentato da un ArrayList di oggetti Riga. Vuoi spostare la riga 9 in posizione 8? Dovrai fare in modo che nell'ArrayList gli oggetti in posizioni 8 e 9 vengano invertiti e successivamente richiamare fireTableRowsUpdated() passandogli gli inidici delle due righe che si sono invertite.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Il problema, è che io utilizzo una LinkedhashMap dietro il mio tableModel

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    E c'è un motivo più che valido per usare una tale struttura dati che poco si addice alle operazioni che stai chiedendo alla tua JTable? Cioè... se io progetto una JTable, devo anche preoccuparmi di scegliere la migliore struttura dati da usare come modello in base alle operazioni che poi devo richiedere alla JTable stessa...

    Una LinkedHashMap poco si appresta a mantenere ordinamenti e ad effettuare degli swap fra elementi (visto che l'ordine dei link viene dato dall'ordine di inserimento degli elementi al suo interno, quindi senza alcuna "logica" apparente).

    Non che tu abbia molte alternative: se vuoi mantenere la LinkedHashMap dovrai ricostruirla ad ogni swap in modo da riflettere gli spostamenti voluti, altrimenti ti consiglierei di usare una struttura dati più flessibile.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Ciao Allora il fatto che ho utilizzando una LinkedHashMap c'è.

    Io devo avere degli oggetti identificato da un codice, però ne posso avere massimo uno con lo stesso codice.

    Ogni volta che inserisco un nuovo oggetto devo verificare che non esiste un oggetto già inserito con la stessa chiave, questa operazione è un'operazione molto frequente.

    Altra operazione, io potrei prendere un oggetto della table, modificare alcuni valori, quindi lo dovrei andare ad aggiornare nella LinkedHashMap, se usavo una lista, ogni volta dovevo andare a fare remove, e add invece così delego tutto alla linkedhashmap.

    Le probabilità che l'utente clicca sui pulsanti per muovere giù o su una riga sono molto piccole in confronto alle mille opeazioni che può fare sugli oggetti. Ecco perchè ho deciso di implementare tutto con una LinkedHashmap.

    Ovviamente non ho optato per una HashMap semplice perchè l'ordine di inserimento lo devo decidere io e non deve aggiornare da solo in base alla Chiave.

    Ho fatto un metodo un pò ortodosso lo ammetto che altro non fa che prendere e ricostruirsi la mappa aggiornamento la posizione degli elementi.

    Ora detto questo, secondo te è sbagliato usare la linkedHashMap???? al posto della lista?

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da bircastri
    Io devo avere degli oggetti identificato da un codice, però ne posso avere massimo uno con lo stesso codice.
    Per questo tipo di trattamenti poteva andare bene anche un TreeSet... certo LinkedHashMap è più performante, ma ti complica la vita in un TableModel.

    Ogni volta che inserisco un nuovo oggetto devo verificare che non esiste un oggetto già inserito con la stessa chiave, questa operazione è un'operazione molto frequente.
    TreeSet fa già da sè questa cosa, se gli oggetti contenuti sono progettati bene.

    Altra operazione, io potrei prendere un oggetto della table, modificare alcuni valori, quindi lo dovrei andare ad aggiornare nella LinkedHashMap, se usavo una lista, ogni volta dovevo andare a fare remove, e add invece così delego tutto alla linkedhashmap.
    Questa non mi è chiara... la modifica di alcuni valori di una JTable non implica una rimozione e un re-inserimento dell'oggetto, ma la modifica dell'oggetto senza toccare nulla della collezione che lo contiene... In buona sostanza, consiste solo nel fare l'override del metodo setValueAt() se si vuole usare l'editing della JTable...

    Ovviamente non ho optato per una HashMap semplice perchè l'ordine di inserimento lo devo decidere io e non deve aggiornare da solo in base alla Chiave.
    Questo è sufficiente a capire che non va bene una collezione pre-ordinata (come TreeSet che avevo suggerito prima)... ma non capisco perchè non possa andar bene un ArrayList... l'ordine in cui vengono inseriti gli oggetti lo puoi decidere tu e uno swap è banale.

    Ora detto questo, secondo te è sbagliato usare la linkedHashMap???? al posto della lista?
    Non è sbagliato di per sé... si può usare una struttura dati qualunque, però si deve cercare di trovare un compromesso fra tutte le operazioni che si desidera poter lasciare all'utente. LinkedHashMap è piuttosto rigido per quanto riguarda gli spostamenti degli elementi (e l'ordine con cui mostrare gli elementi lo decide comunque lui a priori). Se, però, questa struttura dati ti agevola nella maggior parte delle operazioni, va bene... vuol dire che il grosso del lavoro lo dovrai fare solo per lo swap.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.