JLabel类:
package com.udc.test2;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JLabel;
public class RichJLabel extends JLabel{
private int tracking;
private int left_x,left_y,right_x,right_y;
public RichJLabel(String text,int tracking){
super(text);
this.tracking=tracking;
}
private Color left_color,right_color;
public void setLeftShadow(int x,int y,Color c){
left_x=x;
left_y=y;
left_color=c;
}
public void setRightShadow(int x,int y,Color c){
right_x=x;
right_y=y;
right_color=c;
}
public Dimension getPreferredSize(){
String text=this.getText();
//字体
FontMetrics fm=this.getFontMetrics(getFont());
int w=fm.stringWidth(text);
w+=(text.length()-1)*tracking;
w+=left_x+right_x;
//设置偏移量
int h= fm.getHeight();
h+=left_y+right_y;
return new Dimension(w,h);
}
public synchronized void reSetText(String text){
this.setText(text);
updateUI();
}
public synchronized void paintComponent(Graphics g){
Graphics2D g2=(Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
char[] chars=getText().toCharArray();
FontMetrics fm=this.getFontMetrics(getFont());
int h=fm.getAscent();
int x=0;
for(int i=0;i<chars.length;i++){
char ch=chars[i];
int w=fm.charWidth(ch)+tracking;
g.setColor(left_color);
g.drawString(""+chars[i], x-left_x, h-left_y);
g.setColor(right_color);
g.drawString(""+chars[i], x+right_x, h+right_y);
//顺序 最后画前景
g.setColor(getForeground());
g.drawString(""+chars[i], x, h);
x+=w;
}
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
}
}
主显示类
package com.udc.test2;
import java.awt.BorderLayout;
import java.awt.Color;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Chrismas extends JFrame{
private JPanel mp;
JPanel centerP=new JPanel();
RichJLabel cen;
long endTime;
public Chrismas(){
bulidView();
new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
int endday=24-Calendar.getInstance().get(Calendar.DATE);
int endhour=24-Calendar.getInstance().get(Calendar.HOUR);
int endminute=60-Calendar.getInstance().get(Calendar.MINUTE);
int endsecond=60-Calendar.getInstance().get(Calendar.SECOND);
cen.reSetText("day:"+endday+" time:"+endhour+":"+endminute+":"+endsecond);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
this.pack();
this.setVisible(true);
}
private void bulidView(){
mp=new JPanel();
mp.setLayout(new BorderLayout());
RichJLabel north=new RichJLabel("Days until " +
"Christmas",0);
north.setLeftShadow(5, 5, Color.white);
north.setRightShadow(-3,-3, new Color(0xccccff));
north.setForeground( new Color(0x8888ff));
north.setFont(north.getFont().deriveFont(60f));
this.getContentPane().add(mp);
mp.add(north,BorderLayout.NORTH);
mp.add(centerP,BorderLayout.CENTER);
int endday=24-Calendar.getInstance().get(Calendar.DATE);
int endhour=24-Calendar.getInstance().get(Calendar.HOUR);
int endminute=60-Calendar.getInstance().get(Calendar.MINUTE);
int endsecond=60-Calendar.getInstance().get(Calendar.SECOND);
cen=new RichJLabel("day:"+endday+" time:"+endhour+":"+endminute+":"+endsecond,0);
cen.setLeftShadow(5, 5, Color.white);
cen.setRightShadow(-3,-3, new Color(0xcc5500));
cen.setForeground( new Color(0xaa6644));
cen.setFont(cen.getFont().deriveFont(80f));
centerP.add(cen);
}
public static void main(String args[]){
Chrismas cs=new Chrismas();
}
}