martinag
asked on
I want a multi-line label!
Hello!
I want a multi-line label.
I have tried using awt label, swing label and many more but none works.
\n, \u0013 and \u0010 gives a little box and \u0013\u0010 gives me two.
I'm getting crazy, this should be really easy.
Of course, the text must break automatically when it reaches the end of the label.
Thanks!
I want a multi-line label.
I have tried using awt label, swing label and many more but none works.
\n, \u0013 and \u0010 gives a little box and \u0013\u0010 gives me two.
I'm getting crazy, this should be really easy.
Of course, the text must break automatically when it reaches the end of the label.
Thanks!
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Hi martinag,
Here is the modified program -->
(I have added two lines in the paint method)
WrappingLabel.java --->
import java.awt.*;
import java.util.*;
public class WrappingLabel extends Component {
private String m_label = "";
public WrappingLabel(String label)
{
this.m_label = label;
}
public WrappingLabel ()
{
}
public synchronized void setText(String label)
{
this.m_label = label;
invalidate();
repaint();
}
private Dimension computeSize()
{
Font fn = getFont();
if (fn == null)
return new Dimension(50, 20);
FontMetrics fm = getFontMetrics(fn);
int height = fm.getHeight();
int descent = fm.getDescent();
StringTokenizer strtok = new StringTokenizer(m_label, "\n");
// find number of lines and maximum line width
int nlines = 0;
int maxwidth = 10;
while (strtok.hasMoreTokens()) {
String line = strtok.nextToken();
nlines ++;
int cwidth = 0;
if (line != null)
cwidth = fm.stringWidth(line);
if (maxwidth < cwidth)
maxwidth = cwidth;
}
if (nlines == 0) nlines = 1;
return new Dimension(maxwidth + 6, nlines * fm.getHeight() + 4);
}
public void paint(Graphics g)
{
if (getForeground() != null)
g.setColor(getForeground() );
FontMetrics fm = getFontMetrics(getFont());
int height = fm.getHeight();
int y = 2 + height;
int x = 3;
Dimension currSize = getSize();
if (currSize.width == 0 || currSize.height == 0)
return;
StringTokenizer strtok = new StringTokenizer(m_label, "\n\r ", true);
String accumilated = "";
int accumilatedWidth = 0;
int spaceWidth = fm.stringWidth(" ");
while (strtok.hasMoreTokens()) {
String currWord = strtok.nextToken();
String delimiter = " ";
if (strtok.hasMoreTokens())
delimiter = strtok.nextToken();
int currWordWidth = fm.stringWidth(
(accumilated.equals("") ? "" : " ") + currWord);
accumilatedWidth = fm.stringWidth(accumilated );
if ( accumilatedWidth + currWordWidth > currSize.width) {
if (accumilated.length() != 0){
g.drawString(accumilated, x, y);
y += height;
}
accumilated = currWord;
accumilatedWidth = fm.stringWidth(currWord);
} else {
accumilated += " " + currWord;
accumilatedWidth = fm.stringWidth(accumilated );
}
if (delimiter.equals("\n") || delimiter.equals("\r")) {
g.drawString(accumilated, x, y);
y += height;
accumilated = "";
accumilatedWidth = 0;
}
}
if (accumilated.length() != 0) {
g.drawString(accumilated, x, y);
y += height;
}
}
public synchronized String getText()
{
return m_label;
}
public Dimension getPreferredSize()
{
return getMinimumSize();
}
public Dimension getMinimumSize()
{
return computeSize();
}
public Dimension getMaximumSize()
{
return getMinimumSize();
}
}
Program to test the label ------>
testlabel.java------->
import java.awt.*;
public class testlabel extends Frame {
public testlabel ()
{
super("Testing wrappinglabel");
WrappingLabel w;
setLayout(new GridLayout(2,2));
add (w = new WrappingLabel("hello world!"));
w.setForeground(Color.gray );
add (w = new WrappingLabel("hello how are you world!\nhi world\nhello"));
w.setForeground(Color.red) ;
add (w = new WrappingLabel("hello world!\nhi world"));
w.setForeground(Color.gree n);
add (w = new WrappingLabel("hello how are you world!\nhi world\nhello"));
w.setForeground(Color.blue );
pack();
}
public static void main(String args[])
{
new testlabel().setVisible(tru e);
}
}
Here is the modified program -->
(I have added two lines in the paint method)
WrappingLabel.java --->
import java.awt.*;
import java.util.*;
public class WrappingLabel extends Component {
private String m_label = "";
public WrappingLabel(String label)
{
this.m_label = label;
}
public WrappingLabel ()
{
}
public synchronized void setText(String label)
{
this.m_label = label;
invalidate();
repaint();
}
private Dimension computeSize()
{
Font fn = getFont();
if (fn == null)
return new Dimension(50, 20);
FontMetrics fm = getFontMetrics(fn);
int height = fm.getHeight();
int descent = fm.getDescent();
StringTokenizer strtok = new StringTokenizer(m_label, "\n");
// find number of lines and maximum line width
int nlines = 0;
int maxwidth = 10;
while (strtok.hasMoreTokens()) {
String line = strtok.nextToken();
nlines ++;
int cwidth = 0;
if (line != null)
cwidth = fm.stringWidth(line);
if (maxwidth < cwidth)
maxwidth = cwidth;
}
if (nlines == 0) nlines = 1;
return new Dimension(maxwidth + 6, nlines * fm.getHeight() + 4);
}
public void paint(Graphics g)
{
if (getForeground() != null)
g.setColor(getForeground()
FontMetrics fm = getFontMetrics(getFont());
int height = fm.getHeight();
int y = 2 + height;
int x = 3;
Dimension currSize = getSize();
if (currSize.width == 0 || currSize.height == 0)
return;
StringTokenizer strtok = new StringTokenizer(m_label, "\n\r ", true);
String accumilated = "";
int accumilatedWidth = 0;
int spaceWidth = fm.stringWidth(" ");
while (strtok.hasMoreTokens()) {
String currWord = strtok.nextToken();
String delimiter = " ";
if (strtok.hasMoreTokens())
delimiter = strtok.nextToken();
int currWordWidth = fm.stringWidth(
(accumilated.equals("") ? "" : " ") + currWord);
accumilatedWidth = fm.stringWidth(accumilated
if ( accumilatedWidth + currWordWidth > currSize.width) {
if (accumilated.length() != 0){
g.drawString(accumilated, x, y);
y += height;
}
accumilated = currWord;
accumilatedWidth = fm.stringWidth(currWord);
} else {
accumilated += " " + currWord;
accumilatedWidth = fm.stringWidth(accumilated
}
if (delimiter.equals("\n") || delimiter.equals("\r")) {
g.drawString(accumilated, x, y);
y += height;
accumilated = "";
accumilatedWidth = 0;
}
}
if (accumilated.length() != 0) {
g.drawString(accumilated, x, y);
y += height;
}
}
public synchronized String getText()
{
return m_label;
}
public Dimension getPreferredSize()
{
return getMinimumSize();
}
public Dimension getMinimumSize()
{
return computeSize();
}
public Dimension getMaximumSize()
{
return getMinimumSize();
}
}
Program to test the label ------>
testlabel.java------->
import java.awt.*;
public class testlabel extends Frame {
public testlabel ()
{
super("Testing wrappinglabel");
WrappingLabel w;
setLayout(new GridLayout(2,2));
add (w = new WrappingLabel("hello world!"));
w.setForeground(Color.gray
add (w = new WrappingLabel("hello how are you world!\nhi world\nhello"));
w.setForeground(Color.red)
add (w = new WrappingLabel("hello world!\nhi world"));
w.setForeground(Color.gree
add (w = new WrappingLabel("hello how are you world!\nhi world\nhello"));
w.setForeground(Color.blue
pack();
}
public static void main(String args[])
{
new testlabel().setVisible(tru
}
}
ASKER
Excellent!
ASKER
There is just one problem, the foreground is set to black (setForeground(Color.black
Could you fix it?