Re: Layout labels with variable text length
In article <7eik80F2gtdv1U1@mid.dfncis.de>,
Simon <count.numbers@web.de> wrote:
Jeffrey H. Coffield wrote:
Simon wrote:
the text field. I know how wide the text field is
(field.getPreferredSize().getWidth()), but I cannot
label.setPreferredWidth(width)
simply because no such method exists.
Have you tried label.setPreferredSize(new Dimension(width,height)); ?
Of course, but I do not know the height. I want the minimum height
such that the given text fits if lines are wrapped at a given
width. The only thing I can do is overestimate the height.
Others have suggested using font metrics, which will give the best
precision. Alternatively, the tutorial suggests overriding
getPreferredSize(). In this example, the label's preferred width is that
of the JTextField; the initial height is the number of lines, as
specified by <br> tags. The layout "breathes" fairly well. If you must
accommodate arbitrary height, a JScrollPane may be advantageous:
<http://java.sun.com/docs/books/tutorial/uiswing/layout/problems.html>
<code>
import java.awt.*;
import javax.swing.*;
public class LabelTest {
private static final String LONG_TEXT = "<html>Very long text. "
+ "Very long text. Very long text. Very long <em>text</em>. "
+ "Very long text. Very long text.<br>Next line. Next line. "
+ "Next line.<br>Next line. Next line.</html>";
public static void main(String[] argv) {
EventQueue.invokeLater(new Runnable() {
//@Override
public void run() {
createGUI();
}
});
}
private static void createGUI() throws HeadlessException {
JTextField field = new JTextField(15);
field.setMinimumSize(field.getPreferredSize());
JFrame d = new JFrame("Label test");
d.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container c = d.getContentPane();
d.setLayout(new BoxLayout(c, BoxLayout.Y_AXIS));
d.add(field);
d.pack();
int w = field.getPreferredSize().width;
MyLabel label = new MyLabel(LONG_TEXT, w);
label.setAlignmentX(JLabel.CENTER_ALIGNMENT);
d.add(label);
d.pack();
d.setVisible(true);
}
static class MyLabel extends JLabel {
private int width;
public MyLabel(String text, int width) {
super(text);
this.width = width;
}
@Override
public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.setSize(width, d.height);
return d;
}
}
}</code>
--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>