Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Problema nascondere e far riapparire colonne JTable

    Ciao a tutti!!
    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??

    Ringrazio anticipatamente...

  2. #2
    Per catturare l'evento del click del mouse sull'header usi:

    codice:
    this.table.getTableHeader().addMouseListener(new MouseAdapter()
                {
                    @Override
                    public void mouseClicked(MouseEvent event)
                    {
                        if(event.getButton() == MouseEvent.BUTTON3) //tasto dx
                        {
                            JTableHeader header = (JTableHeader)event.getSource();
                            //blabla....
                        }
                    }
                }
            );
    Per creare il menù popup, usi JPopupMenu e aggiungi un JMenuItem per ogni colonna della tabella.

    Infine, considera questo codice:

    codice:
    //rimuovo la colonna 0
            int index = 0;
            TableColumnModel colModel = this.table.getColumnModel();
            TableColumn col = colModel.getColumn(index);
            colModel.removeColumn(col);
    ...
    ...
    ...
    // inserisco di nuovo la colonna e la ricolloco nella posizione iniziale
            int count = colModel.getColumnCount();
            colModel.addColumn(col);
            colModel.moveColumn(count, index);
    Puoi incapsulare questa logica in una classe che implementa TableColumnModel. Non ti assicuro che sia il metodo migliore però.

    Se non hai familiarità con questi argomenti, ti consiglio di studiarteli da qualche parte altrimenti difficilmente riuscirai a tirar su quello che desideri


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

    Re: Problema nascondere e far riapparire colonne JTable

    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??
    Allora, le questioni qui sono diverse. Innanzitutto la questione della gestione degli eventi del mouse.
    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.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    ok, grazie mille!!! mi siete stati veramente d'aiuto...!
    Solo un'ultima cosa: è possibile bloccare le colonne?? Cioè fare in modo che non sia possibile spostare le colonne trascinandole con il mouse??
    Grazie!!

  5. #5
    codice:
    table.getTableHeader().setReorderingAllowed(false);

  6. #6
    grazie mille!!! ce l'ho fatta finalmente a fare tutto quanto!!
    C'è un metodo che allinea bene le colonne facendo un doppio click nell'header della jtable tra una colonna e l'altra?? Insomma come fa Windows... quando compare la doppia freccettina del mouse si fa un doppio click e si allinea perfettamente la colonna.
    Grazie.

  7. #7
    e poi, ci sta un modo semplice per far apparire in una jtable al passaggio del mouse solo quel testo che è stato troncato?? Cioè quella cella che ha del testo con i 3 punti di sospensione alla fine...

    Ringrazio anticipatamente.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fashionprivate
    ci sta un modo semplice per far apparire in una jtable al passaggio del mouse solo quel testo che è stato troncato?? Cioè quella cella che ha del testo con i 3 punti di sospensione alla fine...
    Vuoi gestire i "tooltip"? La questione dei tooltip per le celle è spiegata sul tutorial Sun:
    Specifying Tool Tips for Cells
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Quel tutorial però ti spiega soltanto come creare un tooltip per la tabella...
    Io vorrei che comparisse soltanto quando la parola dentro la cella è troncata a metà... solo in quel caso.
    E' possibile fare una cosa del genere??

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fashionprivate
    che comparisse soltanto quando la parola dentro la cella è troncata a metà...
    È il componente che visualizza il contenuto della cella (tipicamente un JLabel) che se è dimensionato fisicamente (in base alla dimensione della cella) più piccolo del contenuto allora mette i puntini. Ma lo "sa" JLabel ... non il TableCellRenderer e nemmeno il JTable. Ma non mi pare esiste un metodo semplice per sapere se JLabel sta accorciando il testo e mostrando degli ellipsis.

    E da una ricerca mi pare di capire che la cosa ha già infastidito altri ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.