JLabel dinâmico

Bom dia colegas.

Estou tentando à algum tempo construir um JLabel dinâmico, alterar seu tamanho de acordo com o texto colocado nele, para que esteja sempre com o tamanho necessário parar mostrar seu conteúdo, sem as reticências.

Meu problema basea-se em descobrir o tamanho ideal, em pixels (altura e largura) para o componente, sendo que o label pode mudar de e conteúdo e fonte em tempo de excecução.

Para resolver isso, busco descobrir como calcular esse tamanho. Mas até agora não tive sucesso.

Alguém já fez algo semelhante, ou teria alguma idéia de como chegar nesse tamanho?

Muito obrigado.

Olá,

Eu já consegui obter o tamanho da String de acordo com o texto e a fonte usada por esse texto. Dê uma olhada na classe FontMetrics

Porém, eu usava um Graphics2D para fazer isso. Tente isso:


JLabel j = new javax.swing.JLabel();
Graphics2D g2 = (Graphics2D)j.getGraphics();
g2.setFont(new Font("Arial",Font.PLAIN,10));
FontMetrics fm = g2.getFontMetrics();
fm.stringWidth(j.getText());

jschuler,

Quem determina o tamanho do componente é o layout manager do container no qual ele foi inserido. Se você usar um BorderLayout, por exemplo, o JLabel não deve mostrar reticências até que o espaço do container pai se esgote (i.e., você vai obter o comportamento “dinâmico” que procura). Portanto, acho que a solução que você procura deve estar mais para o lado de escolher um layout manager adequado.

Se ainda assim você quiser saber o tamanho preferido do JLabel, no entanto, use:

jlabel.getPreferredSize();

Abraços,

Amigo, faço o que vc está querendo.

Numa determinada ocasição eu insiro dinamicamente os JLabels dentro de um JPanel. Em meu JPanel está configurado o layout como “Free Design”, ou seja, tô usando o Matisse.

Ai, em tempo de execução eu crio os JLabels e adiciono no JPanel. Para conseguir o que vc quer, ou seja um “JLabel com autosize”… hehehe… basta simplesmente ao criar o JLabel NÃO DEFINIR SEU TAMANHO. Descobri que não definindo o tamanho ele fica um esquema “autosize”.

Veja por ex, este JLabel eu tô especificando o tamanho, ele fica com um tamanho fixo na tela:

JLabel labelA = new JLabel(); labelA.setFont(new java.awt.Font("Arial", 0, 11)); labelA.setForeground(cor); labelA.setText(filtro.getCampo().getDescricao()); labelA.setPreferredSize(new java.awt.Dimension(130, 14)); labelA.setName(String.valueOf(pos++));

Já este eu não especifico o tamanho, oque faz com que ele ajuste o tamanho na tela de acordo com seu conteúdo:

JLabel labelB = new JLabel(); labelB.setFont(new java.awt.Font("Arial", 0, 11)); labelB.setForeground(cor); labelB.setText(""); labelB.setName(String.valueOf(pos++)); // não especifico o tamanho para esse label para que ele fique "autosize" durante a execução

Ambos os JLabels estão sendo adicionados no msm JPanel, usando o mesmo layout portanto, e funciona da forma como expliquei.

Boa sorte! :wink:

Estava atrás disso, funcionou beleza.

Valeu Renata.