这个需求我也不知道有没有用, 我在做一个房地产项目的时候用到, 因为标签里面用"平方米"似乎太长了一点, 为了节约空间所有用了M2这样的字符.
这个东西只能在JDK1.5里面用, 因为用到了com.sun的类. 1.6肯定是要改的, 不过我还没有时间看1.6到底怎么做.
另外这个其实也重写了UI, 不过Label的UI说实话, 各种类型倒也没有什么很大区别, 因为是透明的, 呵呵.
其实有个简单的方法:
label.setText("<html>测试M<sup>2</sup></html>");就可以了, 但是这样的话位置上稍稍有点小问题, 如果不是那么讲究的话, 这个其实是比较省力的方法.
不过我们还是来说说复杂的方法, 毕竟那个2戳在上面不是太好看.
import
java.awt.Font;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.metal.MetalLabelUI;
import com.sun.java.swing.SwingUtilities2;
/** */ /**
* Created at 2006-9-5 15:35:12<br>
* 字串中M2的2将被上写
*
* @author Brad.Wu
* @version 1.0
*/
@SuppressWarnings( "serial" )
public class M2Label extends JLabel ... {
public M2Label() ...{
super();
}
public M2Label(String text) ...{
super(text);
}
static class M2LabelUI extends MetalLabelUI ...{
protected static M2LabelUI labelUI = new M2LabelUI();
public static ComponentUI createUI(JComponent c) ...{
return labelUI;
}
/** *//**
* (非 Javadoc)
*
* @see javax.swing.plaf.metal.MetalLabelUI#paintDisabledText(javax.swing.JLabel,
* java.awt.Graphics, java.lang.String, int, int)
*/
@Override
protected void paintDisabledText(JLabel l, Graphics g, String s, int textX, int textY) ...{
String text = l.getText();
if (text.indexOf("M2") != -1) ...{
int mnemIndex = l.getDisplayedMnemonicIndex();
g.setColor(UIManager.getColor("Label.disabledForeground"));
int pos = text.indexOf("M2");
String s1 = text.substring(0, pos + 1);
String s2 = text.substring(pos + 2);
SwingUtilities2.drawStringUnderlineCharAt(l, g, s1, mnemIndex, textX, textY);
Font oldFont = l.getFont();
int width = l.getFontMetrics(oldFont).stringWidth(s1);
Font upperFont = new Font(oldFont.getName(), oldFont.getStyle(), oldFont.getSize() - 4);
g.setFont(upperFont);
SwingUtilities2.drawString(l, g, "2", textX + width, textY - 4);
g.setFont(oldFont);
width += l.getFontMetrics(upperFont).stringWidth("2");
SwingUtilities2.drawStringUnderlineCharAt(l, g, s2, mnemIndex, textX + width, textY);
} else ...{
super.paintEnabledText(l, g, s, textX, textY);
}
}
/** *//**
* (非 Javadoc)
*
* @see javax.swing.plaf.basic.BasicLabelUI#paintEnabledText(javax.swing.JLabel,
* java.awt.Graphics, java.lang.String, int, int)
*/
@Override
protected void paintEnabledText(JLabel l, Graphics g, String s, int textX, int textY) ...{
String text = l.getText();
if (text.indexOf("M2") != -1) ...{
int mnemIndex = l.getDisplayedMnemonicIndex();
g.setColor(l.getForeground());
int pos = text.indexOf("M2");
String s1 = text.substring(0, pos + 1);
String s2 = text.substring(pos + 2);
SwingUtilities2.drawStringUnderlineCharAt(l, g, s1, mnemIndex, textX, textY);
Font oldFont = l.getFont();
int width = l.getFontMetrics(oldFont).stringWidth(s1);
Font upperFont = new Font(oldFont.getName(), oldFont.getStyle(), oldFont.getSize() - 4);
g.setFont(upperFont);
SwingUtilities2.drawString(l, g, "2", textX + width, textY - 4);
g.setFont(oldFont);
width += l.getFontMetrics(upperFont).stringWidth("2");
SwingUtilities2.drawStringUnderlineCharAt(l, g, s2, mnemIndex, textX + width, textY);
} else ...{
super.paintEnabledText(l, g, s, textX, textY);
}
}
}
/** *//**
* (非 Javadoc)
*
* @see javax.swing.JLabel#updateUI()
*/
@Override
public void updateUI() ...{
setUI(new M2LabelUI());
}
public static void main(String[] args) ...{
Font font = UIManager.getFont("Label.font");
UIManager.put("Label.font", new Font(font.getName(), Font.PLAIN, font.getSize()));
JFrame frame = new JFrame();
M2Label label = new M2Label("测试M2:");
label.setEnabled(false);
frame.getContentPane().add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.metal.MetalLabelUI;
import com.sun.java.swing.SwingUtilities2;
/** */ /**
* Created at 2006-9-5 15:35:12<br>
* 字串中M2的2将被上写
*
* @author Brad.Wu
* @version 1.0
*/
@SuppressWarnings( "serial" )
public class M2Label extends JLabel ... {
public M2Label() ...{
super();
}
public M2Label(String text) ...{
super(text);
}
static class M2LabelUI extends MetalLabelUI ...{
protected static M2LabelUI labelUI = new M2LabelUI();
public static ComponentUI createUI(JComponent c) ...{
return labelUI;
}
/** *//**
* (非 Javadoc)
*
* @see javax.swing.plaf.metal.MetalLabelUI#paintDisabledText(javax.swing.JLabel,
* java.awt.Graphics, java.lang.String, int, int)
*/
@Override
protected void paintDisabledText(JLabel l, Graphics g, String s, int textX, int textY) ...{
String text = l.getText();
if (text.indexOf("M2") != -1) ...{
int mnemIndex = l.getDisplayedMnemonicIndex();
g.setColor(UIManager.getColor("Label.disabledForeground"));
int pos = text.indexOf("M2");
String s1 = text.substring(0, pos + 1);
String s2 = text.substring(pos + 2);
SwingUtilities2.drawStringUnderlineCharAt(l, g, s1, mnemIndex, textX, textY);
Font oldFont = l.getFont();
int width = l.getFontMetrics(oldFont).stringWidth(s1);
Font upperFont = new Font(oldFont.getName(), oldFont.getStyle(), oldFont.getSize() - 4);
g.setFont(upperFont);
SwingUtilities2.drawString(l, g, "2", textX + width, textY - 4);
g.setFont(oldFont);
width += l.getFontMetrics(upperFont).stringWidth("2");
SwingUtilities2.drawStringUnderlineCharAt(l, g, s2, mnemIndex, textX + width, textY);
} else ...{
super.paintEnabledText(l, g, s, textX, textY);
}
}
/** *//**
* (非 Javadoc)
*
* @see javax.swing.plaf.basic.BasicLabelUI#paintEnabledText(javax.swing.JLabel,
* java.awt.Graphics, java.lang.String, int, int)
*/
@Override
protected void paintEnabledText(JLabel l, Graphics g, String s, int textX, int textY) ...{
String text = l.getText();
if (text.indexOf("M2") != -1) ...{
int mnemIndex = l.getDisplayedMnemonicIndex();
g.setColor(l.getForeground());
int pos = text.indexOf("M2");
String s1 = text.substring(0, pos + 1);
String s2 = text.substring(pos + 2);
SwingUtilities2.drawStringUnderlineCharAt(l, g, s1, mnemIndex, textX, textY);
Font oldFont = l.getFont();
int width = l.getFontMetrics(oldFont).stringWidth(s1);
Font upperFont = new Font(oldFont.getName(), oldFont.getStyle(), oldFont.getSize() - 4);
g.setFont(upperFont);
SwingUtilities2.drawString(l, g, "2", textX + width, textY - 4);
g.setFont(oldFont);
width += l.getFontMetrics(upperFont).stringWidth("2");
SwingUtilities2.drawStringUnderlineCharAt(l, g, s2, mnemIndex, textX + width, textY);
} else ...{
super.paintEnabledText(l, g, s, textX, textY);
}
}
}
/** *//**
* (非 Javadoc)
*
* @see javax.swing.JLabel#updateUI()
*/
@Override
public void updateUI() ...{
setUI(new M2LabelUI());
}
public static void main(String[] args) ...{
Font font = UIManager.getFont("Label.font");
UIManager.put("Label.font", new Font(font.getName(), Font.PLAIN, font.getSize()));
JFrame frame = new JFrame();
M2Label label = new M2Label("测试M2:");
label.setEnabled(false);
frame.getContentPane().add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
上面用到的SwingUtilities2类貌似换到了sun.swing包下(1.6). 不知道sun是什么用意, 估计包换一下就可以在1.6下使用了.
如果你想兼容的话, 呵呵, 最好写个Util类替换掉, 自适应么, 应该还是比较简单的.