Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: Alternativa a JTable

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104

    Alternativa a JTable

    Buongiorno a tutti! Per chi utilizza spesso Java..
    Devo visualizzare una tabella contenente i valori di una matrice.. Ho utilizzato una JTable ma ho bisogno che vi sia una label (o etichetta) sia sulla colonna (che con la JTable viene visualizzata), sia sulle righe (cosa che invece la JTable forse non permette).

    matrice.jpg
    La JTable non l'ho creata da codice, l'ho inserita nel frame con NetBeans, poi la popolo con un ciclo for nel codice. Come vedete riesco a visualizzare l'etichetta sulle colonne, ma sulle righe non so come fare.. si può fare o devo usare altro? Sapreste consigliarmi?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da LuLyLuNa Visualizza il messaggio
    Ho utilizzato una JTable ma ho bisogno che vi sia una label (o etichetta) sia sulla colonna (che con la JTable viene visualizzata), sia sulle righe (cosa che invece la JTable forse non permette).
    JTable permette di avere 1 "header" sulle colonne. Non offre di per sé nulla riguardo "header" sulle singole righe.
    Ma tu potresti banalmente farlo mettendo una colonna in più a sinistra magari con un colore di sfondo differente (o magari, azzardo, addirittura con lo stesso renderer che viene usato per gli header di colonna).

    Se non vuoi che questa colonna sia "scrollabile" orizzontalmente (verticamente invece ha senso) insieme alla tabella, esiste anche una tecnica particolare che sfrutta una caratteristica di JScrollPane, cioè il fatto che in JScrollPane ci sono 9 aree (vedi disegnino nella documentazione javadoc: JScrollPane) tra cui anche un'area normalmente non utilizzata chiamata "row header".

    Quando metti un JTable come "view" in JScrollPane, esso mette il JTableHeader nell'area "column header". Basterebbe mettere una intera JTable di 1 sola colonna nell'area "row header" per avere una intestazione fissa sulle righe.
    Come gestire i dati è un altro discorso ma ... si può fare benissimo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    Quote Originariamente inviata da andbin Visualizza il messaggio
    JTable permette di avere 1 "header" sulle colonne. Non offre di per sé nulla riguardo "header" sulle singole righe.
    Ma tu potresti banalmente farlo mettendo una colonna in più a sinistra magari con un colore di sfondo differente (o magari, azzardo, addirittura con lo stesso renderer che viene usato per gli header di colonna).

    Se non vuoi che questa colonna sia "scrollabile" orizzontalmente (verticamente invece ha senso) insieme alla tabella, esiste anche una tecnica particolare che sfrutta una caratteristica di JScrollPane, cioè il fatto che in JScrollPane ci sono 9 aree (vedi disegnino nella documentazione javadoc: JScrollPane) tra cui anche un'area normalmente non utilizzata chiamata "row header".

    Quando metti un JTable come "view" in JScrollPane, esso mette il JTableHeader nell'area "column header". Basterebbe mettere una intera JTable di 1 sola colonna nell'area "row header" per avere una intestazione fissa sulle righe.
    Come gestire i dati è un altro discorso ma ... si può fare benissimo.
    hai ragione, potrei usare la prima colonna come "header" delle righe..
    avendo una JTable così

    DefaultTableModel model = new DefaultTableModel();

    non so, però, come si setta il background di una colonna..

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da LuLyLuNa Visualizza il messaggio
    hai ragione, potrei usare la prima colonna come "header" delle righe..
    avendo una JTable così

    DefaultTableModel model = new DefaultTableModel();

    non so, però, come si setta il background di una colonna..
    Innanzitutto se è una colonna di "intestazione" per le righe, non dovrebbe mai essere editabile. In DefaultTableModel tutte le celle sono per default editabili. Se vuoi applicare una logica differente usando sempre DefaultTableModel, devi estendere DefaultTableModel (anche con una anonymous inner class, se viene breve) e fare l'override di isCellEditable.

    Per quanto riguarda lo sfondo, è principalmente il renderer che controlla l'aspetto (sfondo compreso) delle celle.
    Potresti creare un tuo renderer apposito ma ovviamente risulta non breve e non banale. Prima dicevo (anzi .. azzardavo) che si potrebbe anche andare a prendere il renderer delle colonne.

    Non testato, ecco due possibili passi da fare:

    codice:
    TableCellRenderer rendererColonne = tabella.getTableHeader().getDefaultRenderer();
    
    tabella.getColumnModel().getColumn(0).setCellRenderer(rendererColonne);

    Ripeto: l'ho scritto al volo ... non l'ho provato. Verifica se funziona e se l'aspetto perlomeno è ok e gradevole.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    Eh.. purtroppo io ho un problema:
    la mia tabella è

    codice:
    DefaultTableModel model = new DefaultTableModel();
             model.addColumn("");
    su questa tabella "model" non ho il metodo getTableHeader() e di conseguenza non ho getDefaultRenderer()

    se uso
    codice:
    JTable model = new JTable();
    il metodo addColumn richiede come parametro TableColumn e non posso più assegnare una stringa come header.. spero di essermi spiegata bene, scusa in anticipo xD

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da LuLyLuNa Visualizza il messaggio
    codice:
    DefaultTableModel model = new DefaultTableModel();
             model.addColumn("");
    su questa tabella "model" non ho il metodo getTableHeader() e di conseguenza non ho getDefaultRenderer()
    Quella che io ho chiamato 'tabella' .... è JTable! Non DefaultTableModel. JTable ha getTableHeader()

    Quote Originariamente inviata da LuLyLuNa Visualizza il messaggio
    codice:
    JTable model = new JTable();
    JTable non è il "model" .... quindi almeno per coerenza/buon senso non chiamare la variabile "model".

    Quote Originariamente inviata da LuLyLuNa Visualizza il messaggio
    il metodo addColumn richiede come parametro TableColumn e non posso più assegnare una stringa come header..
    TableColumn rappresenta le caratteristiche "fisiche" della colonna (preferredWidth, resizable, ecc...). Non è il addColumn di JTable che di norma devi usare (i TableColumn vengono creati automaticamente da JTable basandosi sulle colonne esposte dal TableModel).

    È il DefaultTableModel che devi configurare con le colonne che vuoi. Se non usi uno dei costruttori, sono comunque disponibili addColumn(Object columnName), addRow(Object[] rowData), ecc....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    non mi sono spiegata..
    l'oggetto

    codice:
    DefaultTableModel model =newDefaultTableModel();
    mi consente di aggiungere colonne passando come parametro l'header che voglio attribuire:

    es. addColumn("ciao")
    in un ciclo for (da 0 a n-1) aggiungo n-1 colonne
    e imposta le dimensioni in automatico, cosa per me assai utile..

    ora.. avendo tale oggetto, come posso lavorare sul colore della prima colonna?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da LuLyLuNa Visualizza il messaggio
    ora.. avendo tale oggetto, come posso lavorare sul colore della prima colonna?
    Il colore (l'aspetto in generale) delle celle/header non centra nulla con il "model". Centrano principalmente solo i "renderer" delle celle/header.

    Io prima ti ho postato 2 righe di codice. Le hai provate? O ti sono sembrate strane/inutili? O non le hai capite? Te le spiego ... non è un problema:

    codice:
    TableCellRenderer rendererColonne = tabella.getTableHeader().getDefaultRenderer();
    
    tabella.getColumnModel().getColumn(0).setCellRenderer(rendererColonne);

    La prima riga prende dal JTable e dal suo JTableHeader il renderer predefinito usato per la riga di intestazione delle colonne. L'header generalmente ha un aspetto diverso dalle celle, ha lo sfondo grigio e il testo generalmente è centrato orizzontalmente. Potrebbe (in linea di massima) andarti bene anche come intestazione delle righe.
    La seconda riga assegna questo renderer anche per tutte le celle nella colonna 0, ovvero la prima.

    Può darsi che non ti piaccia o non ti vada bene .... ma è una prova che puoi fare. Se non ti va bene, si possono vedere altre soluzioni.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Il colore (l'aspetto in generale) delle celle/header non centra nulla con il "model". Centrano principalmente solo i "renderer" delle celle/header.

    Io prima ti ho postato 2 righe di codice. Le hai provate? O ti sono sembrate strane/inutili? O non le hai capite? Te le spiego ... non è un problema:

    codice:
    TableCellRenderer rendererColonne = tabella.getTableHeader().getDefaultRenderer();
    
    tabella.getColumnModel().getColumn(0).setCellRenderer(rendererColonne);

    La prima riga prende dal JTable e dal suo JTableHeader il renderer predefinito usato per la riga di intestazione delle colonne. L'header generalmente ha un aspetto diverso dalle celle, ha lo sfondo grigio e il testo generalmente è centrato orizzontalmente. Potrebbe (in linea di massima) andarti bene anche come intestazione delle righe.
    La seconda riga assegna questo renderer anche per tutte le celle nella colonna 0, ovvero la prima.

    Può darsi che non ti piaccia o non ti vada bene .... ma è una prova che puoi fare. Se non ti va bene, si possono vedere altre soluzioni.
    a mente lucida ho riprovato il tuo codice.. vanno benissimo..!!!

    sapresti dirmi se esiste un metodo predefinito o anche creato da altri utenti, per dare dimensione alle colonne in base al contenuto??

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da LuLyLuNa Visualizza il messaggio
    a mente lucida ho riprovato il tuo codice.. vanno benissimo..!!!
    Bene, son contento.

    Quote Originariamente inviata da LuLyLuNa Visualizza il messaggio
    sapresti dirmi se esiste un metodo predefinito o anche creato da altri utenti, per dare dimensione alle colonne in base al contenuto??
    JTable non offre nulla per adattare la larghezza di una colonna al suo contenuto. Se cerchi in rete (ad esempio vedi questa discussione su stackoverflow), l'approccio tipico utilizzato è quello di invocare esplicitamente il renderer passando man mano i valori di ciascuna cella, ottenendo quindi il Component dal renderer e prendendo il suo preferred-width, determinando poi il massimo tra tutte le larghezze.
    Lo so ... sembra/è un po' noioso ....
    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.