Suggerimento Java 116: imposta le opzioni della tabella - in fase di esecuzione!

Java Foundation Classes (JFC) offre una ricca selezione di componenti per la creazione di interfacce utente grafiche (GUI) intelligenti e interattive. È possibile visualizzare i dati tabulari utilizzando la javax.swing.JTableclasse. In questo suggerimento Java, esamineremo come risolvere alcuni JTableproblemi comuni .

Per prima cosa, definiamo la nostra JTableclasse iniziale, di base MyTable:

import javax.swing.table. *; import javax.swing. *; import java.awt. *; la classe pubblica MyTable estende JTable {// costruttore predefinito public MyTable () {super (); } // costruttore per creare una tabella con un dato numero di righe e colonne public MyTable (int row, int col) {super (row, col); }}

Abbastanza semplice! La nostra MyTableimplementazione iniziale è solo uno stock JTable.

Nelle sezioni seguenti lavoreremo con varie JTableopzioni di visualizzazione, come barre di scorrimento, larghezze delle colonne, selezione e altri attributi. Estenderemo MyTablee incorporeremo vari metodi che supporteranno le funzionalità di visualizzazione che vogliamo modificare. Ogni sezione aggiunge un nuovo metodo alla MyTableclasse, quindi alla fine avremo un metodo totalmente riutilizzabile JTable.

Scorri le tue tabelle

Innanzitutto, usiamo il nostro JTableper mostrare alcuni dati tabulari. Ho creato la TableColumnTestclasse per dimostrare JTablele capacità di:

import javax.swing.table. *; import javax.swing. *; import java.awt.event. *; import java.awt. *; / ** Autore Sonal Goyal, [email protected] * / public class TableColumnTest {frame JFrame protetto; protetto JScrollPane scrollpane; tabella MyTable protetta; public TableColumnTest () {// (1) Crea il modello di tabella. DefaultTableModel dm = new DefaultTableModel (); // Nomi per ciascuna delle colonne. String [] columnNames = {"Questa sarà un'intestazione di colonna molto lunga", "Colonna B", "Colonna C", "Colonna D", "Colonna E", "Colonna F", "Colonna G", " Colonna H "," Colonna I "," Colonna J "}; // I valori dei dati effettivi. Intero [] [] data = new Integer [8] [10]; // Popolare la matrice di dati. for (int row = 0; row <8; row ++) {for (int col = 0; col <10;++ col) {data [row] [col] = new Integer (1000000); }} // Configura il modello con i dati e le intestazioni di colonna. dm.setDataVector (data, columnNames); // (2) Crea la tabella. table = new MyTable (); // (3) Collega il modello alla tabella. table.setModel (dm); // (4) Crea un riquadro di scorrimento per la tabella. scrollpane = new JScrollPane (tabella); // (5) Rende visibile la tabella. frame = nuovo JFrame (); frame.getContentPane (). add (scrollpane); frame.setSize (200, 150); frame.setVisible (true); } public static void main (String [] args) {TableColumnTest test = new TableColumnTest (); }scrollpane = new JScrollPane (tabella); // (5) Rende visibile la tabella. frame = nuovo JFrame (); frame.getContentPane (). add (scrollpane); frame.setSize (200, 150); frame.setVisible (true); } public static void main (String [] args) {TableColumnTest test = new TableColumnTest (); }scrollpane = new JScrollPane (tabella); // (5) Rende visibile la tabella. frame = nuovo JFrame (); frame.getContentPane (). add (scrollpane); frame.setSize (200, 150); frame.setVisible (true); } public static void main (String [] args) {TableColumnTest test = new TableColumnTest (); }

L'applicazione dimostrativa è piuttosto semplice. Costruiamo un semplice JTablefacendo quanto segue:

  • Crea e configura il TableModel, che contiene informazioni su righe, colonne, intestazioni di colonna e dati effettivi

  • Crea e configura il JTable, che visualizza i dati dal modello

  • Collega il JTableal modello creato nel primo passaggio

Ma c'è una svolta in questo primo listato di codice: un riquadro di scorrimento viene aggiunto al punto 4. Mostriamo la tabella costruita e configurata all'interno di a JFrame; vedere la Figura 1 per i risultati dello scorrimento.

Come mostrato nella Figura 1, è difficile distinguere eventuali intestazioni di colonna o dati di tabella. Sebbene abbiamo aggiunto una barra di scorrimento, la barra di scorrimento orizzontale non viene visualizzata. Uno sguardo ravvicinato alla JTableclasse rivela il motivo. La JTableclasse ha un attributo per la modalità di ridimensionamento automatico, che determina se la tabella ridimensiona automaticamente le larghezze delle colonne (per coprire l'intera larghezza della tabella) e come esegue il ridimensionamento. Può assumere uno dei seguenti valori:

  • AUTO_RESIZE_OFF: non regola automaticamente le larghezze delle colonne; utilizzare una barra di scorrimento
  • AUTO_RESIZE_NEXT_COLUMN: quando una colonna viene regolata nell'interfaccia utente, regola la colonna successiva in modo opposto
  • AUTO_RESIZE_SUBSEQUENT_COLUMNS: durante la regolazione dell'interfaccia utente, modifica le colonne successive per preservare la larghezza totale
  • AUTO_RESIZE_LAST_COLUMN: durante tutte le operazioni di ridimensionamento, applica le regolazioni solo all'ultima colonna
  • AUTO_RESIZE_ALL_COLUMNS: durante tutte le operazioni di ridimensionamento, ridimensiona proporzionalmente tutte le colonne

Per impostazione predefinita, JTableridimensiona le altre colonne per preservare l'aspetto generale, il che spiega la Figura 1. Quindi, se vogliamo visualizzare le colonne con una barra di scorrimento orizzontale, aggiungiamo un metodo MyTablee lo chiamiamo dai costruttori:

/ ** Questo metodo mostra la barra di scorrimento orizzontale quando richiesto. * Viene chiamato nei due costruttori forniti qui. * / public void showHorScroll (boolean show) {if (show) {setAutoResizeMode (JTable.AUTO_RESIZE_OFF); } altro {setAutoResizeMode (JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); }}

La figura 2 mostra il display con la barra di scorrimento orizzontale visibile:

Controllo delle colonne JTable

Puoi controllare la larghezza delle colonne e renderle non ridimensionabili. Questa sezione mostra come.

Colonne più larghe

Spesso si desidera una colonna più larga o più stretta di un'altra. Per modificare la larghezza di una colonna, utilizza TableColumnModel:

/ ** Questo metodo dovrebbe essere chiamato per impostare la colonna * all'indice pColumn su una larghezza di pWidth. * / public void setColumnWidth (int pColumn, int pWidth) {// Ottieni il modello di colonna. TableColumnModel colModel = getColumnModel (); // Recupera la colonna all'indice pColumn e imposta la sua larghezza preferita. colModel.getColumn (pColumn) .setPreferredWidth (pWidth); }

Puoi anche aggiungere un pulsante e il suo ascoltatore di azioni a JFrame, in modo che facendo clic sul pulsante si modifichi la larghezza della tabella:

JButton resizeButton = new JButton ("Ridimensiona terza colonna"); setResizeButton.addActionListener (this); public void actionPerformed (ActionEvent e) {// Controlla quale pulsante è stato cliccato. if (e.getActionCommand (). equals ("Ridimensiona terza colonna")) {System.out.println ("Ridimensiona chiamato - ridimensiona la terza colonna a 300"); table.setColumnWidth (2, 300); // Forza l'aggiornamento della GUI. table.invalidate (); frame.invalidate (); frame.validate (); frame.repaint (); }

In questo caso, pColumnè l'indice della colonna ed pWidthè la nuova larghezza impostata. Il prima e il dopo del clic sul pulsante Ridimensiona sono mostrati nelle Figure 3 e 4.

Colonne non ridimensionabili

Per uso generale, puoi ridimensionare le colonne trascinando le intestazioni. Il codice seguente rimuove la possibilità di ridimensionare in base a pIsResize. Se pIsResizeè vero, la colonna può essere ridimensionata; altrimenti, non può essere ridimensionato:

public void setResizable (int pColumn, boolean pIsResize) {// Ottieni il modello di colonna. TableColumnModel colModel = getColumnModel (); // Imposta ridimensionabile o meno. colModel.getColumn (pColumn) .setResizable (pIsResize); }

In questo caso, pColumnè l'indice della colonna non ridimensionabile. Ottenere la colonna ( getColumn(..)) e impostare una semplice proprietà ( setResizable(..)) è tutto ciò che devi fare.

Selezioni di colonne

Perché non selezionare un'intera colonna con il clic di un pulsante anziché una singola cella? Gli JTableschermi selezionate / deselezionate cellule chiamando di una cellula isCellSelected(int row, int col)metodo. L'override di questo metodo fornisce i risultati desiderati, che dipendono dalla selezione booleana, passata come parametro al setSelect()metodo. Se vero, la colonna verrà selezionata; se falso, non verrà selezionato. La chiave è salvare la colonna come colSelect(), con un flag "select" che indica se questa colonna deve essere selezionata o deselezionata:

int colSelect; selezione booleana; / ** Imposta la colonna all'indice col su selezionata o deselezionata * in base al valore di select. * / public void setSelect (int col, boolean select) {colSelect = col; this.select = seleziona; } / ** Questo metodo restituisce se una particolare cella è selezionata o meno. * / public boolean isCellSelected (int row, int column) genera IllegalArgumentException {// sovrascrive il metodo per la colonna impostata in setSelect () if (colSelect == column) {if (select) return true; altrimenti restituisce falso; } else {return super.isCellSelected (riga, colonna); }}

La Figura 5 mostra il risultato in cui è stata selezionata la colonna D.

Intestazioni di controllo

Come avrai notato, l'intestazione della colonna nella prima colonna è più lunga della larghezza di quella colonna. Affrontiamo questo problema ripristinando la larghezza della colonna:

/ ** Imposta le dimensioni dell'intestazione e della colonna in base al testo dell'intestazione * / public void setHeaderSize (int pColumn) {// Ottiene il nome della colonna della colonna data. Valore stringa = getColumnName (pColumn); // Calcola la larghezza richiesta per la colonna. Metriche FontMetrics = getGraphics (). GetFontMetrics (); int width = metrics.stringWidth (value) + (2 * getColumnModel (). getColumnMargin ()); // Imposta la larghezza. setColumnWidth (pColumn, larghezza); }

Con il codice sopra eseguito, la Figura 6 mostra il risultato dell'intestazione della colonna ridimensionata.

Un JTable ricco di funzionalità

In questo suggerimento, abbiamo provato varie opzioni di visualizzazione su un semplice JTablee abbiamo modificato quelle opzioni dopo che la tabella è stata visualizzata. Nel processo, abbiamo sviluppato una tabella che offre capacità di interazione utente più ricche. Esplora il resto delle JTablefunzionalità di e scopri quali interessanti puoi creare!

Sonal Goyal lavora con Java da tre anni. È un ingegnere con sede in India e ha lavorato a lungo alla progettazione e all'implementazione di sistemi orientati agli oggetti utilizzando Java IO, JFC, CORBA, i18n e reflection. John D. Mitchell è il coordinatore di Java Tips per JavaWorld.

Ulteriori informazioni su questo argomento

  • Il codice sorgente per il TableColumnTest completato

    //images.techhive.com/downloads/idge/imported/article/jvw/2001/09/tablecolumntest.java

  • Il codice sorgente per MyTable completato

    //images.techhive.com/downloads/idge/imported/article/jvw/2001/09/mytable.java

  • Visualizza la documentazione dell'API JTable

    //java.sun.com/j2se/1.3/docs/api/javax/swing/JTable.html

  • Sfoglia il tutorial Swing JTable su

    //www.java.sun.com/docs/books/tutorial/uiswing/components/table.html

  • "Java Tip 102Add Multiple JTable Cell Editors per Column," Tony Colston (JavaWorld)

    //www.javaworld.com/javaworld/javatips/jw-javatip102.html

  • "Java Tip 77Enable Copy and Paste Functionality between Swing's JTables and Excel," Ashok Banerjee and Jignesh Mehta (JavaWorld)

    //www.javaworld.com/javaworld/javatips/jw-javatip77.html

  • For more on AWT/Swing, check out JavaWorld's Topical Index

    //www.javaworld.com/channel_content/jw-awt-index.shtml

  • For more on Foundation Classes, check out JavaWorld's Topical Index

    //www.javaworld.com/channel_content/jw-foundation-index.shtml

  • For more on User Interface Design, check out JavaWorld's Topical Index

    //www.javaworld.com/channel_content/jw-ui-index.shtml

  • View all previous Java Tips and submit your own

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Learn Java from the ground up in JavaWorld's Java 101 column

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

  • Java experts answer your toughest Java questions in JavaWorld's Java Q&A column

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Sign up for JavaWorld's free weekly email newsletters

    //www.idg.net/jw-subscribe

  • Troverai una vasta gamma di articoli relativi all'IT tratti dalle nostre pubblicazioni gemelle su .net

Questa storia, "Suggerimento Java 116: imposta le opzioni della tabella - in fase di esecuzione!" è stato originariamente pubblicato da JavaWorld.