可以显示M2的标签, 2是上标

来源:互联网 发布:魔兽世界画面7.0 优化 编辑:程序博客网 时间:2024/05/17 09:23
这个需求我也不知道有没有用, 我在做一个房地产项目的时候用到, 因为标签里面用"平方米"似乎太长了一点, 为了节约空间所有用了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
);
 }

}

上面用到的SwingUtilities2类貌似换到了sun.swing包下(1.6). 不知道sun是什么用意, 估计包换一下就可以在1.6下使用了.

如果你想兼容的话, 呵呵, 最好写个Util类替换掉, 自适应么, 应该还是比较简单的.