Allora, le questioni qui sono diverse. Innanzitutto la questione della gestione degli eventi del mouse.Originariamente inviato da fashionprivate
Ho un problema nella jtable: praticamente vorrei dare la possibilità all'utente di scegliere quali colonne visualizzare e quali no. Cioè con un semplice click col tasto destro del mouse sull'header della colonna vorrei che si visualizzassero i nomi di tutte le colonne e vorrei dare la possibilità di nascondere o far riapparire la colonna selezionata.
Ho provato a cercare in rete su come fare ciò ma non ho trovato proprio niente.
Qualche idea???
E poi, come faccio a catturare l'evento del click destro sull'header della tabella??
C'è un metodo apposito??
Da JTable con getTableHeader() si ottiene il JTableHeader. Sul JTableHeader si registra un MouseListener (metodo addMouseListener).
Il MouseListener è "globale" del header, non di una certa colonna del header!
Nel tuo caso probabilmente non ti interessa su quale colonna del header l'utente ha cliccato. Se, come succede per altre situazioni, fosse di interesse, si deve prendere il Point del click dal MouseEvent e usare il metodo int columnAtPoint(Point) di JTableHeader che fornisce l'indice "logico" della colonna nella tabella a video (nota: non del model!).
Puoi implementare il metodo mouseClicked() del listener, se ti serve proprio giusto il "click". Solo una questione. Viene invocato indipendentemente dal pulsante del mouse usato. Se vuoi "filtrare" solo il tasto testo devi usare boolean isRightMouseButton(MouseEvent) di SwingUtilities per testare se è il tasto destro.
Saputo che è stato cliccato con il tasto destro sul header ... qui ora c'è la questione della scelta delle colonne. L'insieme delle colonne è rappresentato da un TableColumnModel, che permette di avere il TableColumn per una certa colonna. L'oggetto visualizzato nel header, tipicamente una stringa, lo dà il getHeaderValue() di TableColumn.
Quindi potresti ad esempio creare un JPopupMenu con varie voci che sono dei JCheckBoxMenuItem per mostrare l'elenco delle colonne.
Ora viene la parte più complessa. Le colonne (i TableColumn) non hanno un flag/proprietà per indicare se essere visibile o meno. Il TableColumnModel invece ha dei metodi addColumn/removeColumn.
Quindi o tu quando rimuovi una colonna te la "tieni" anche da parte per poterla poi aggiungere in seguito ... oppure c'è un'altra strada ma è più difficile.
Si potrebbe realizzare un tuo MyTableColumnModel (che implementa la interfaccia TableColumnModel) che fa da "wrapper" per il TableColumnModel reale al fine di "esporre" al di fuori le sole colonne selezionate. Ma questo vorrebbe dire conoscere molto bene la interfaccia TableColumnModel e i suoi metodi.