Pergunta

ou esta não existe, ou eu não estou pensando / pesquisar corretamente porque já é tarde ...

Eu quero definir uma largura de coluna JTable no Swing com base em um valor protótipo para a maior cadeia de eu esperar (ou sabe) para existir em uma determinada coluna. Eu não sei o # de pixels desde que eu não necessariamente sabem o tipo de letra em tempo de compilação.

Existe uma maneira para definir um valor protótipo para fins de largura da coluna, o caminho até lá é para fins de altura da linha? Se sim, como?

Foi útil?

Solução

Você tentou criar um JLabel em tempo de execução e usando seu tamanho para redimensionar sua mesa?

// 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);        
}

Outras dicas

Você pode tentar o seguinte código:

/**
 * 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 estendidos JXTable / Coluna protótipos ajuste apoio para coluna inicial largura de dimensionamento, você pode fazê-lo, quer após as colunas foram criados

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

ou através da implementação de um ColumnFactory costume que configura as colunas sobre a criação

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

Em vez de criar um rótulo, obter o componente real da TableCellRenderer e testar o tamanho em que:

// 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();

Este é um único exemplo de coluna, você precisará repetir isso para obter o tamanho de cada coluna (e também defini-lo). Consulte http://www.exampledepot.com/egs/javax.swing .table / PackCol.html para um exemplo deste.

Se você não sabe a fonte em tempo de compilação, em seguida, a largura de qualquer coluna JTable é sempre vai ser desconhecido. Como uma verificação de sanidade, abrir um documento de texto e jogar com diferentes fontes, embora mantendo a constante tamanho do ponto. O comprimento do que está escrito varia de acordo com uma fonte-by-font base mas a altura não funciona.

A altura de uma linha JTable deve ser capaz de ser determinada para qualquer tamanho de fonte (em pontos), uma vez que é um definido padrão. Pode levar um pouco de experimentação, no entanto, dado que JTable provavelmente dá um pouco de espaçamento entre as células no meio destes.

Se você não pode garantir nem o tamanho da fonte, nem a própria fonte em tempo de compilação, então eu estou interessado no que responde a outras pessoas vêm com:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top