Fiquei curioso pra ver como funcionaria com FontMetrics e fiz o seguinte Frame: (o código está implementado no método
jButton1ActionPerformed)
/*
* FontMetricsFrame.java
*
* Created on 13 de Janeiro de 2005, 17:36
*/
package testefontmetrics;
import java.awt.FontMetrics;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
/**
*
* @author viecili
*/
public class FontMetricsFrame extends javax.swing.JFrame {
/** Creates new form FontMetricsFrame */
public FontMetricsFrame() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
labelLarg = new javax.swing.JLabel();
labelAlt = new javax.swing.JLabel();
labelText = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();
jTextField2 = new javax.swing.JTextField();
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
jButton1 = new javax.swing.JButton();
getContentPane().setLayout(null);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("FontMetrics Test");
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
jLabel1.setText("jLabel1");
jLabel1.setVerticalAlignment(javax.swing.SwingConstants.TOP);
jLabel1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
getContentPane().add(jLabel1);
jLabel1.setBounds(10, 170, 380, 20);
labelLarg.setText("Largura");
getContentPane().add(labelLarg);
labelLarg.setBounds(10, 10, 60, 20);
labelAlt.setText("Altura");
getContentPane().add(labelAlt);
labelAlt.setBounds(10, 30, 60, 20);
labelText.setText("Texto");
getContentPane().add(labelText);
labelText.setBounds(10, 50, 60, 20);
jTextField1.setFont(new java.awt.Font("MS Sans Serif", 0, 10));
jTextField1.setText(String.valueOf(jLabel1.getBounds().getWidth()));
jTextField1.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusLost(java.awt.event.FocusEvent evt) {
jTextField1FocusLost(evt);
}
});
getContentPane().add(jTextField1);
jTextField1.setBounds(70, 10, 80, 20);
jTextField2.setFont(new java.awt.Font("MS Sans Serif", 0, 10));
jTextField2.setText(String.valueOf(jLabel1.getBounds().getHeight()));
jTextField2.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusLost(java.awt.event.FocusEvent evt) {
jTextField2FocusLost(evt);
}
});
getContentPane().add(jTextField2);
jTextField2.setBounds(70, 30, 80, 19);
jTextArea1.setText(jLabel1.getText());
jScrollPane1.setViewportView(jTextArea1);
getContentPane().add(jScrollPane1);
jScrollPane1.setBounds(70, 50, 320, 80);
jButton1.setText("Vai !");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
getContentPane().add(jButton1);
jButton1.setBounds(320, 140, 71, 23);
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-400)/2, (screenSize.height-300)/2, 400, 300);
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
// ajustar o texto no label
StringBuffer texto = new StringBuffer("");
String[] palavras = jTextArea1.getText().split(" ");
FontMetrics fm = jLabel1.getFontMetrics(jLabel1.getFont());
Rectangle b = jLabel1.getBounds();
int larg = (int) b.getWidth();
StringBuffer linha = new StringBuffer("");
int sw = 0;
if (palavras.length <= 1) {
jLabel1.setText(jTextArea1.getText());
repaint();
return;
}
for (int i = 0; i < palavras.length; i++) {
String l = (linha.toString()+" "+palavras[i]);
sw = fm.stringWidth(l);
if (larg < sw) { // não coube
texto.append(linha.toString()+"\n");
linha = new StringBuffer(palavras[i]);
} else if (larg == sw) { // coube certinho
texto.append(l+"\n");
linha = new StringBuffer("");
} else { // cabe mais
if (linha.length() == 0) {
linha.append(palavras[i]);
} else {
linha.append(" "+palavras[i]);
}
}
}
if (linha.length() > 0) {
texto.append(linha);
} else {
texto.deleteCharAt(texto.length()-1);
}
Rectangle2D sb = fm.getStringBounds(texto.toString(), null);
Insets iset = jLabel1.getInsets();
jLabel1.setBounds(10, 170, (int) sb.getWidth() + iset.left + iset.right, (int) sb.getHeight() + iset.top + iset.bottom);
jLabel1.setText(texto.toString());
jTextArea1.setText(texto.toString());
mostraDimensao();
repaint();
}
private void jTextField2FocusLost(java.awt.event.FocusEvent evt) {
// TODO add your handling code here:
// redimensionar a altura
ajustaLabel();
}
private void jTextField1FocusLost(java.awt.event.FocusEvent evt) {
// TODO add your handling code here:
// redimensionar a largura
ajustaLabel();
}
private void ajustaLabel() {
jLabel1.setBounds(10,170, (int) Double.parseDouble((jTextField1.getText())), (int) Double.parseDouble((jTextField2.getText())));
repaint();
}
private void mostraDimensao() {
jTextField1.setText(String.valueOf(jLabel1.getBounds().getWidth()));
jTextField2.setText(String.valueOf(jLabel1.getBounds().getHeight()));
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new FontMetricsFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JLabel labelAlt;
private javax.swing.JLabel labelLarg;
private javax.swing.JLabel labelText;
// End of variables declaration
}
E descobri que o Label só pode ter uma linha, não adianta colocar "\n" que ele vai desenhar tudo numa linha só :cry: :evil: