Quando la JTable viene "disegnata", non sa a priori di che lunghezza sono i dati delle varie colonne.

Quindi imposta una dimensione di default per tutte.

Oppure si prende quelle che gli abbiamo impostato noi da codice.

Se invece volessimo fare in modo che si auto-ridimensionino?

In ambito Java, le API più conosciute per la manipolazione dei file XML sono sicuramente SAX e DOM.

A queste possiamo aggiungere JAXB (Java Architecture for XML Binding), che ha un approccio ancora differente.

Quale sia meglio tra le tre possibilità, penso dipenda soprattutto da quello che si vuole ottenere.

Comunque con JAXB mi ci sono trovato bene, ed oggi ne vediamo un esempio.

Abbiamo parlato varie volte di JTable, anche come riempirla da database o da JSON.

Oggi vediamo come riempirla da XML.

Partiamo da un file del genere:


<?xml version="1.0" encoding="UTF-8"?>
<clienti>
  <cliente>
    <ragione_sociale>CASA</ragione_sociale>
    <email>casa@casa.it</email>
  </cliente>
  <cliente>
    <ragione_sociale>UFFICIO</ragione_sociale>
    <email>uff@uff.it</email>
  </cliente>
</clienti>

Come vedete l'elemento principale si chiama clienti, e poi c'è un elemento per ogni cliente.

Ogni elemento cliente ha, a sua volta, un elemento ragione_sociale e un elemento email.

Oggi vi propongo una classe, per certi versi un pò "vecchiotta", per impostare il drag and drop su una JTable.

In sostanza voglio poter spostare le righe di una JTable, e metterle nell'ordine che mi pare.

Per ottenere questo dobbiamo impostare alcune opzioni e un transfer handler:

myTable.setDragEnabled(true);
myTable.setDropMode(DropMode.INSERT_ROWS);
myTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
myTable.setTransferHandler(new MyTransferHandler());

Dove MyTransferHandler è una classe che estende TransferHandler.

JTable è un componente di Java Swing molto usato.

Anche se può sembrare strano, svuotare una JTable non richiede un singolo comando; o almeno quello che vi propongo è l'unic che mi ha funzionato.

Sarà, forse, dovuto al fatto che io uso un DefaultTableModel personalizzato (che vi posto per semplice chiarimento):

public class MyTableModel extends DefaultTableModel {

    public MyTableModel(Object[][] data, String[] col) {
        super(data, col);
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }
}

Comunque vi propongo un metodo che permette di svuotare una JTable.