Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    JTable con colonne fisse

    Ciao a tutti,

    dovrei realizzare una tabella come quella in allegato, in cui le prime due colonne sono fisse e le altre vengono avvalorate real time. Le prime due colonne devono rimanere fisse mentre le altre si possono scrollare. In piu, come se non bastasse, ogni header di ogni colonna avvalorate in modo dinamico deve essere associata una callback con delle informazioni relative a quella particolare colonna. Che qualcuno mi aiuti...... grazie
    Immagini allegate Immagini allegate

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: JTable con colonne fisse

    Originariamente inviato da rocklife
    Le prime due colonne devono rimanere fisse mentre le altre si possono scrollare.
    Per questo punto, posso dire che è fattibile, anche se non è proprio una banalità (purtroppo).

    Partiamo con una premessa: tipicamente un JTable lo si mette dentro un JScrollPane affinché possa, se necessario, scrollare completamente. In tal modo il JTable è messo nella "view" centrale del JScrollPane.

    In JScrollPane però si possono anche occupare, con dei componenti, i 4 corner (gli angoli) e anche occupare il "column header" (è qui che per default va il header della tabella) e il "row header" (normalmente non utilizzato).

    Per "fissare" delle colonne, dovresti mettere nel row header di JScrollPane una seconda tabella. JScrollPane farebbe scrollare automaticamente in "sincrono" le due tabelle nel senso verticale e ovviamente solo la tabella centrale può scrollare orizzontalmente.

    Il problema sta solo nello spartire le colonne tra le due tabelle. Le soluzioni sono diverse: o usi due table model distinti (potrebbe andarti bene o no ... dipende), oppure usi lo stesso table model per le due tabelle e vai a modificare il TableColumnModel di ogni tabella per spostare e/o rimuovere colonne affinché "veda" solo certe colonne del model.

    Ulteriore soluzione se si vuole usare 1 solo table model che contiene i dati veri e propri è realizzare un table model "wrapper" che ne incapsula un'altro facendo "esporre" solo certe colonne. Questa soluzione sarebbe generica e riutilizzabile anche in altri contesti.
    Il problema non sarebbe tanto nell'esporre solo certe colonne ma gestire gli eventi. Il table model "vero" deve notificare il table model "wrapper" che deve stabilire se notificare la "view" (JTable o altro) solo se l'evento ha senso per ciò che fa "vedere" di fuori.
    C'ho sempre pensato a questa cosa ma non ho mai avuto tempo di provarla!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Dpo un po' di prove ho applicato questa soluzione:

    codice:
            VariableTable variableTable = null;
            FixedTable fixedTable = null;
    
            //Create a table
            fixedTable = new FixedTable(fixedColumn, fixedData);
            variableTable = new VariableTable(variableColumn, variableRow);
            
            //Add the table in panel
            setViewportView(variableTable);
            getViewport().setBackground(new Color(255, 255, 190));
            setRowHeaderView(fixedTable);
            getRowHeader().setBackground(new Color(255, 255, 190));
    
            //Set the Table header in upper left corner of JScrollPane
            setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable.getTableHeader());
    
            //Set the dimension of row header of JScrollPane
            getRowHeader().setPreferredSize(new Dimension(280, 96));
    In piu per mettere il listener sul header:

    codice:
    variableTable.getTableHeader().addMouseListener(new HeaderListener(variableTable.getTableHeader()));

  4. #4
    Grazie mille dei consigli andbin. In ogni caso ho utilizzato due table model differenti perche' i dati gestiti dalle due tabelle non sono uniformi.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.