Alinhar o Header de uma TableColumn (TableView)

Pessoal,

busquei nos DOCs e não aparece opção para alinhar o header de uma TableColumn. Consegui fazê-lo
para o conteúdo da célula, mas não para o header. Alguem pode me ajudar? Grato.

Tem que usar um renderizador customizado.

Exemplo do StackOverflow:

JTableHeader header = table.getTableHeader();
header.setDefaultRenderer(new HeaderRenderer(table));

Renderizador:

class HeaderRenderer implements TableCellRenderer {

    DefaultTableCellRenderer renderer;

    public HeaderRenderer(JTable table) {
        renderer = (DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer();
        // alinhando no centro
        renderer.setHorizontalAlignment(JLabel.CENTER);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table,
                                                   Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus,
                                                   int row,
                                                   int col) {
        return renderer.getTableCellRendererComponent(table,
                                                      value,
                                                      isSelected,
                                                      hasFocus,
                                                      row,
                                                      col);
    }
}

staroski, obrigado pela resposta. Pergunta: esta sua orientação se aplica tb
ao JavaFx? Pergunto isso pois a TableColumns a que me refiro é do universe
JavaFX. Grato.

Olá, que tipo de alinhamento você quer fazer? não ficou muito claro.

Andrauss, é o alinhamento do header (o título) da TableColumn. Ex: tenho 1
TableView com 3 colunas (TableColumn). A 1a Coluna com o titulo “Nome”, a 2a
com o título “Valor” e a 3a com o título “Data”. Eu gostaria de alinhar o “Nome” a
esquerda, “Valor” a direita e “Data” no Centro. (que é o default). Grato.

Dá pra fazer via CSS tanto para a célula, quanto para a coluna. Crie um arquivo .css e coloque isso nele:

.table-view .column-header.coluna-valor .label{ /* Coluna Valor*/
   -fx-alignment: center-right;
}

.table-view .column-header.coluna-data .label{ /* Coluna Data*/
   -fx-alignment: center;
}

.table-view .table-cell.coluna-valor { /* Célula da coluna Valor*/
   -fx-alignment: center-right;
}

.table-view .table-cell.coluna-data { /* Célula da coluna Data */ 
   -fx-alignment: center;
}

Depois adicione o arquivo aos estilos do seu painel, em seguida pegue a table column que desejar e adicione a classe. Exemplo:

colunaValor.getStyleClass().add("coluna-valor");

Ou no Scene Builder:

Dica.: Para saber o nome das classes CSS dos componentes do JavaFX e sua hierarquia, use o CSS Analyser do Scene Builder (View > Show CSS Analyser):

Veja a Documentação do CSS do JavaFx também.

1 curtida

Andrauss, obrigado. Criei um arq com sufixo css e inclui as instruções. Entretanto,
acho que falta a inclusão dele aos “estilos do painel”. Confesso que não entendi.
Entrei no DOCs do CSS e não vi referências a biblioteca de estilos ou q/q
coisa similar. Por favor, vc pode me orientar nessa etapa? Grato.

Me referi ao seu painel root, ou o painel em que a tableview está dentro, exemplo:

Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
root.getStylesheets().add("/caminho_para_o_arquivo/nome_arquivo.css");

No Scene Builder:

A estrutura que estou usando é VBox (com HBox, TableView e Botões) dentro
de uma Scene que por sua vez está dentro de um Stage. Não estou usando FXML.

Olá, não faz diferença vbox também possui o método getStylesheets.

Andrauss, desculpe-me pela demora na resposta. E, o pior, estou "travado"
neste ponto. As colunas continuam com o header centralizado e a seguinte msg
foi dada pelo Compilador:

WARNING: Resource “c:/java/programs/coluna-esquerda.css” not found.

Verifiquei e o arq coluna-esquerda.css está exatamente no caminho
c:/java/programs

Veja as linhas de código abaixo:

Definição do VBox
VBox vbox = new VBox(hBox, table|View, label);
vbox.setMinWidth(795);
vbox.setMinHeight(600);
vbox.setSpacing(5);
vbox.setPadding (new Insets (5));
vbox.setStyle("-fx-background-color:linear-gradient(to bottom, red, black);");
vbox.getStylesheets().add(“c:/java/programs/coluna-esquerda.css”);

Definição da Coluna:
colunaEsquerda.getStyleClass().add(“coluna-esquerda”);

Definição do .CSS:
.table-view .column-header.coluna-esquerda .label{
-fx-alignment: center-left;
}

Grato pela ajuda.

ajustando: é tableView e não table|View.

Como estão organizados os pacotes do seu projeto? Qual IDE? O caminho é esse que te falei, e o erro foi bem claro ao dizer que não encontrou o arquivo especificado. Faça o seguinte: coloque o arquivo .css no mesmo diretório da classe main ai você não precisa especificar todo o caminho do arquivo, seria algo como:

vbox.getStylesheets().add("/nome_da_pasta/coluna-esquerda.css");

Andrauss, vc estava certo? Funcionou quando eu tirei todo o caminho
e coloquei só a ultima Pasta e o arquivo, que no meu caso
foi “/pack1/coluna-esquerda.css”, onde o pack1 é o pacote onde todas as .class
estão. Que estranho, não? Eu olhei e reolhei e o caminho completo estava
absolutamente correto. Pq sera q desta vez só podia ser usada a ultima pasta e
o arquivo? Bom, vc me ajudou novamente. Obrigado.

Tenho uma outra duvida sobre Mascaras para o TextField. Vou abrir outro topico
e dar este como resolvido. Grato.