import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Image; import java.awt.Polygon; import java.awt.image.BufferedImage; public class LedNumber extends Component { private Polygon segmentPolygon[]; private int numberSegment[][] = { { 0, 1, 2, 3, 4, 5 }, // 0 { 1, 2 }, // 1 { 0, 1, 3, 4, 6 }, // 2 { 0, 1, 2, 3, 6 }, // 3 { 1, 2, 5, 6 }, // 4 { 0, 2, 3, 5, 6 }, // 5 { 0, 2, 3, 4, 5, 6 }, // 6 { 0, 1, 2 }, // 7 { 0, 1, 2, 3, 4, 5, 6 }, // 8 { 0, 1, 2, 3, 5, 6 } // 9 }; private int div[] = {1,10,100,1000,10000,100000}; private Image numberImage[]; private Color fontColor = Color.red; //the color of number private Color bgColor = Color.black; private Color maskColor = Color.darkGray; private int dWidth = 12; private int dHeight = 21; public LedNumber(){ init(); } public LedNumber(Color fc){ fontColor=fc; init(); } public LedNumber(Color fc,Color bgc){ fontColor=fc; bgColor=bgc; init(); } public LedNumber(Color fc,Color bgc,Color mc){ fontColor=fc; bgColor=bgc; maskColor=mc; init(); } public void setBackGround(Color bgc){ this.bgColor=bgc; } public void setFontColor(Color fc){ this.fontColor=fc; } public void setMaskColor(Color mc){ this.maskColor=mc; } public void setDigitalWidth(int dWidth){ this.dWidth=dWidth; } public void setDigitalHeight(int dHeight){ this.dHeight=dHeight; } public Image getLedImage(int dg,int bound){ dg%=div[bound]; Image image=new BufferedImage(dWidth*bound,dHeight,BufferedImage.TYPE_INT_RGB); Graphics g=image.getGraphics(); bound--; for (int i = bound; i >= 0; i--) { g.drawImage(numberImage[dg / div[i]], (bound - i) * dWidth, 0, this); dg %= div[i]; } return image; } public void init(){ segmentPolygon=new Polygon[7]; numberImage=new Image[10]; setNumberPolygon(); setNumberImage(); } public void setNumberImage(){ int i=0; int j=0; int k; Graphics g; while(i<10){ numberImage[i]=new BufferedImage(15,20,BufferedImage.TYPE_INT_RGB); g=numberImage[i].getGraphics(); g.setColor(bgColor); g.fillRect(0, 0, 15, 20); g.setColor(Color.DARK_GRAY); j=0; while(j<numberSegment[8].length){ k=numberSegment[8][j]; g.fillPolygon(segmentPolygon[k]); j++; } g.setColor(fontColor); j=0; while(j<numberSegment[i].length){ k=numberSegment[i][j]; g.fillPolygon(segmentPolygon[k]); j++; } i++; } } public void setNumberPolygon(){ int mid=dHeight/2+1; segmentPolygon[0]=new Polygon(); segmentPolygon[0].addPoint(2, 1); segmentPolygon[0].addPoint(dWidth-2, 1); segmentPolygon[0].addPoint(dWidth-5, 4); segmentPolygon[0].addPoint(4, 4); segmentPolygon[1]=new Polygon(); segmentPolygon[1].addPoint(dWidth-1, 1); segmentPolygon[1].addPoint(dWidth-1, mid-1); segmentPolygon[1].addPoint(dWidth-2, mid-1); segmentPolygon[1].addPoint(dWidth-4, mid-3); segmentPolygon[1].addPoint(dWidth-4, 4); segmentPolygon[2] = new Polygon(); segmentPolygon[2].addPoint(dWidth-1, mid); segmentPolygon[2].addPoint(dWidth-1, dHeight-2); segmentPolygon[2].addPoint(dWidth-4, dHeight-5); segmentPolygon[2].addPoint(dWidth-4, mid+1); segmentPolygon[2].addPoint(dWidth-3, mid); segmentPolygon[3] = new Polygon(); segmentPolygon[3].addPoint(dWidth-2, dHeight-1); segmentPolygon[3].addPoint(1, dHeight-1); segmentPolygon[3].addPoint(4, dHeight-4); segmentPolygon[3].addPoint(dWidth-4, dHeight-4); segmentPolygon[4] = new Polygon(); segmentPolygon[4].addPoint(1, dHeight-2); segmentPolygon[4].addPoint(1, mid); segmentPolygon[4].addPoint(3, mid); segmentPolygon[4].addPoint(4, mid+1); segmentPolygon[4].addPoint(4, dHeight-5); segmentPolygon[5] = new Polygon(); segmentPolygon[5].addPoint(1, mid-1); segmentPolygon[5].addPoint(1, 1); segmentPolygon[5].addPoint(4, 4); segmentPolygon[5].addPoint(4, mid-3); segmentPolygon[5].addPoint(2, mid-1); segmentPolygon[6] = new Polygon(); segmentPolygon[6].addPoint(3, mid-1); segmentPolygon[6].addPoint(4, mid-2); segmentPolygon[6].addPoint(dWidth-4, mid-2); segmentPolygon[6].addPoint(dWidth-3, mid-1); segmentPolygon[6].addPoint(dWidth-5, mid+1); segmentPolygon[6].addPoint(4, mid+1); } }
测试代码:
import java.awt.BorderLayout; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class TestLed2 extends JFrame { public static void main(String[] args) { new TestLed2(); } private JPanel jp1; private JLabel jl1; private LedNumber led; private int timepassed; public TimeThread timeThread; public TestLed2() { setTitle("Led Number"); setSize(300, 300); timepassed = 0; timeThread = new TimeThread(); led = new LedNumber(); jp1 = new JPanel(); jl1 = new JLabel(); jl1.setBorder(BorderFactory.createLoweredBevelBorder()); jl1.setIcon(new ImageIcon(led.getLedImage(timepassed, 5))); jp1.add(jl1); this.add(jp1, BorderLayout.NORTH); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); timeThread.start(); } class TimeThread extends Thread { public TimeThread() {} @Override public void run() { while (timepassed < 1000 && Thread.currentThread() == timeThread) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { jl1.setIcon(new ImageIcon(led .getLedImage(timepassed, 5))); } }); try { Thread.sleep(999); } catch (InterruptedException e) { System.out.println("interupped"); e.printStackTrace(); } timepassed++; } } } }