impostazione di un valore prototipo (per il calcolo della larghezza automatica) di una colonna JTable

StackOverflow https://stackoverflow.com/questions/838095

Domanda

o questo non esiste, o non sto pensando / cercando correttamente perché è tardi ...

Voglio impostare una larghezza di colonna JTable in Swing in base a un valore prototipo per la stringa più grande che mi aspetto (o che conosco) di esistere in una colonna particolare. Non conosco il numero di pixel poiché non conosco necessariamente il carattere al momento della compilazione.

Esiste un modo per impostare un valore prototipo per scopi di larghezza di colonna, come per scopi di altezza di riga? In tal caso, come?

È stato utile?

Soluzione

Hai provato a creare una JLabel in fase di esecuzione e a utilizzarne le dimensioni per ridimensionare la tabella?

// create a label that will be using the run-time font
JLabel prototypeLabel = new JLabel("Not Applicable")

// get the labels preferred sizes
int preferredWidth = prototypeLabel.getPreferredSize().getWidth();
int preferredHeight = prototypeLabel.getPreferredSize().getHeight();

// set the sizes of the table's row and columns
myTable.setRowHeight(preferredHeight);

for(TableColumn column : myTable.getColumnModel.getColumns()){
   column.setPreferredWidth(preferredWidth);        
}

Altri suggerimenti

Puoi provare il seguente codice:

/**
 * Sets the preferred width of the columns of a table from prototypes
 * @param table the target table
 * @param prototypes an array of prototypes, {@code null} values will be ignored
 * @param setMaxWidth {@code true} if the maximum column width should also be set
 */
public static void setWidthFromPrototype(JTable table, Object[] prototypes, boolean setMaxWidth) {
if (prototypes.length != table.getColumnCount())
  throw new IllegalArgumentException("The prototypes array should contain exactly one element per table column");
for (int i = 0; i < prototypes.length; i++) {
    if (prototypes[i] != null) {
        Component proto = table.getCellRenderer(0,i)
                .getTableCellRendererComponent(table, prototypes[i], false, false, 0, i);
        int prefWidth = (int) proto.getPreferredSize().getWidth() + 1;
        table.getColumnModel().getColumn(i).setPreferredWidth(prefWidth);
        if (setMaxWidth)
            table.getColumnModel().getColumn(i).setMaxWidth(prefWidth);
    }
}
}

SwingX prototipi di impostazione estesa JXTable / Column per il dimensionamento iniziale della larghezza della colonna, puoi farlo sia dopo le colonne sono stati creati

for(int col = 0; ....) {
    table.getColumnExt(col).setPrototypeValue(myPrototype[col]
}

o implementando una ColumnFactory personalizzata che configura le colonne al momento della creazione

ColumnFactory factory = new ColumnFactory() {
    @Override
    protected void configureTableColumn(TableModel model, TableColumnExt columnExt) {
        super(...);
        columnExt.setPrototypeValue(myPrototype[columnExt.getModelIndex()];
    }
}
table.setColumnFactory(factory);
table.setModel(myModel);

Invece di creare un'etichetta, ottenere il componente effettivo da TableCellRenderer e testare le dimensioni su quello:

// create the component that will be used to render the cell
Comp prototype = table.getDefaultRenderer(model.getColumnClass(i)).getTableCellRendererComponent(table, "Not Applicable", false, false, 0, i);

// get the labels preferred sizes
int preferredWidth = comp.getPreferredSize().getWidth();
int preferredHeight = comp.getPreferredSize().getHeight();

Questo è un esempio di singola colonna, dovrai ripeterlo per ottenere la dimensione di ogni colonna (e anche impostarla). Vedi http://www.exampledepot.com/egs/javax.swing .table / PackCol.html per un esempio di questo.

Se non si conosce il carattere al momento della compilazione, la larghezza di qualsiasi colonna JTable sarà sempre sconosciuta. Come controllo di integrità, apri un documento di testo e gioca con caratteri diversi mantenendo costante la dimensione del punto. La lunghezza di ciò che è scritto varia in base al carattere, ma l'altezza no.

L'altezza di una riga JTable dovrebbe poter essere determinata per qualsiasi dimensione del carattere (in punti) in quanto è un standard definito . Potrebbe richiedere un po 'di sperimentazione, dato che JTable probabilmente fornisce un po' di spazio tra le celle.

Se non puoi garantire né la dimensione del carattere né il carattere stesso al momento della compilazione, allora sono interessato a ciò che le risposte arrivano ad altre persone :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top