Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Inserire footer jtable

  1. #1

    Inserire footer jtable

    Salve ragazzi, avrei una domanda da porvi.

    Ho una tabella con n righe che possono variare. L'utente clicca usl pulsante aggiungi e il sistema
    aggiunge una nuova riga al JTable.

    Vorrei inotlre inserire 4 righe fisse che devono rappresentare le ultime 4 righe della tabella.

    In pratica è come se devo inserire un footer.

    E' possibile realizzare una cosa del genere?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Sì. Ma devi lavorare con il TableModel associato alla tua tabella.
    Ti basterà far sì che gli inserimenti delle nuove righe avvengano appena prima delle righe del "footer".

    Se, ad esempio, sei assolutamente certo che il "footer" sia costituito da 4 righe ed il tuo TableModel è costituito da un ArrayList, ti basterà adottare qualcosa del genere per l'inserimento di una nuova riga:

    codice:
    ArrayList<TuaRiga> modelloLogico;
    ...
    public void addRow(TuaRiga riga) {
       modelloLogico.add(modelloLogico.size()-5, riga);
       /*
        -5 perchè il metodo size() ritorna la dimensione, quindi l'ultimo elemento
        è in posizione size() - 1. Tu devi inserire alla riga precedente la quart'ultima.
        */
    }
    Chiaramente dovrai effettuare dei controlli per assicurarti che il modello contenga il "footer", altrimenti l'istruzione andrà in errore.

    PS: tutto questo ha senso se non hai un RowSorter associato alla tabella o se questo RowSorter è a conoscenza del "footer" e lavora di conseguenza.


    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
    si però il discorso è questo:
    io ho la tabella dentro un jScrollPane, nel momento in cui le righe della tabella
    superano la dimensione si attiva lo scroller di lato, in questo caso le ultime 4 righe verrebbero
    nascoste invece a me serve che queste vengano sempre mostrate. Come posso fare?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    La questione non è delle più semplici. Una tabella non è fatta solo di righe, ma anche di colonne. Quindi dire "voglio che vengano mostrate le ultime 4 righe" non è sufficiente: ti basta che vengano mostrate le prime colonne delle ultime 4 righe (scroll orizzontale tutto a sinistra)? Vuoi visualizzare le ultime colonne delle ultime righe (scroll orizzontale tutto a destra)?

    Supponiamo la prima, dovrebbe essere sufficiente questo codice (non l'ho provato):

    codice:
    public void addRow(TuaRiga riga) {
       ...  //   Tutto come mostrato prima
       scrollToLastRow();
    }
    
    ...
    
    private void scrollToLastRow() {
       int lastRow = tabella.getRowCount() - 1;
       Rectangle rect = tuaTabella.getCellRect(lastRow, 0, true);
       tuaTabella.scrollRectToVisible( rect );
       tuaTabella.clearSelection();
       tuaTabella.setRowSelectionInterval(lastRow, lastRow);
       tuaTabella.getModel().fireTableDataChanged();
    }
    Questo dovrebbe selezionare l'ultima riga e renderla visibile (forando, quindi, lo scroll del JScrollPane).


    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
    La tabella ha una dimensione prefissata che mi consente di visualizzare fino a 15 righe.
    Io voglio che le ultime 4 righe con tutte le 9 colonne siano sempre visibili.
    Quindi se io inserisco 30 righe io vorrei che le ultime 4 righe siano sempre visiili
    sia se lo scroller sia su che giù.
    In pratica deve avere lo stesso meccanismo del header deve essere sempre visibile

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ok, quindi ciò che ho postato io non è l'effetto che vuoi ottenere.

    Spulciando la rete ho trovato due tecniche diverse per ottenere lo stesso effetto, entrambe con dei problemi non proprio banalissimi da risolvere.

    Primo approccio:
    Costruire un RowSorter che sia in grado di riordinare le righe in modo tale da avere sempre nel "footer" le righe interessate. Questo è nu approccio che si adatta bene al tuo caso, dato che hai una tabella di dimensione verticale fissa che ti visualizza sempre 15 righe. In questo caso il RowSorter dovrebbe riordinare le righe in modo da avere sempre nelle posizioni 11, 12, 13 e 14 le 4 righe del footer (nel caso il modello contenga meno di 15 righe, le dovrebbe visualizzare nelle ultime posizioni).

    Difetto: risulta, a quanto sembra, difficoltosa la selezione delle righe del footer.

    Secondo approccio:
    Costruire una seconda tabella con lo stesso TableModel della principale. Questa seconda tabella conterrà solo le righe del footer e dovrà essere posizionata sotto la tabella principale (senza un JScrollPane, quindi senza TableHeader).

    Difetto: risulta difficile sincronizzare la visualizzazione delle due tabella nel caso di ridimensionamento (o riordino) delle colonne.

    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

  7. #7
    allora ho trovato anche io questa risoluzione, parlo della seconda.

    Si adatta diciamo bene al mio caso in quanto ho le colonne fisse quindi l'utente non le può muovere.

    se metto l'intera tabella (le due tabelle) in uno jpanel unico e poi metto questo nel frame quando vado a ridimensionare se le porta tutte e due. Questa però è da verificare. Appena rientro posto un pò di codice.

    Grazie cmq

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.