您的位置:首页 > 移动开发 > 微信开发

一个数字显示管的小程序

2005-01-16 12:33 190 查看
闲来无事,就喜欢写写小的程序,前段时间写了个数码管的小程序,发现还是很有用处的。
自己做了个测试程序,显示结果如下:



以下是程序源代码和测试程序代码。希望大家能给点建议。包括程序结构,功能方面的都很欢迎。

/*-**************************************************************/
* Author : OuJinLiang
* Copyright : SEI.BUAA (2003) .copyright reserved.
* Date : 2004-12-24
/*-**************************************************************/

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;

/**
* 数码管
*/
public class Digital {

// 单个字符的默认宽度
private static final int DEFAULT_WIDTH = 50;
// 单个字符的默认高度
private static final int DEFAULT_HEIGHT = 90;

// 默认背景色
private static final Color DEFAULT_BACKGROUND = Color.BLACK;
// 默认前景色
private static final Color DEFAULT_FOREGROUND = Color.RED;

private static int bits[][];
private static int polygon[][][];

private Color background;
private Color foreground;
private int width;
private int height;
private int gap;
private int offset;

private Polygon polygonArray[] = new Polygon[9];

static {
bits = new int[][] { { '0', 0x03F }, { '1', 0x018 }, { '2', 0x06E }, { '3', 0x07C }, { '4', 0x059 }, { '5', 0x075 }, { '6', 0x077 }, { '7', 0x01C }, { '8', 0x07F }, { '9', 0x07D }, { 'A', 0x05F }, { 'B', 0x073 }, { 'C', 0x027 }, { 'D', 0x07A }, { 'E', 0x067 }, { 'F', 0x047 }, { 'T', 0x184 }, { 'P', 0x04F }, { 'M', 0x19F }, { ':', 0x180 }, { '-', 0x040 }, { -1, 0x0 }, };

int p1[][] = { { 0, 0, 10, 10 }, { 2, 43, 38, 12 } };
int p2[][] = { { 0, 0, 10, 10 }, { 46, 88, 78, 52 } };
int p3[][] = { { 2, 48, 38, 12 }, { 0, 0, 10, 10 } };
int p4[][] = { { 50, 50, 40, 40 }, { 2, 43, 38, 12 } };
int p5[][] = { { 50, 50, 40, 40 }, { 46, 88, 77, 52 } };
int p6[][] = { { 2, 48, 38, 12 }, { 90, 90, 80, 80 } };
int p7[][] = { { 2, 12, 38, 48, 38, 12 }, { 45, 40, 40, 45, 50, 50 } };
int p8[][] = { { 20, 20, 30, 30 }, { 12, 38, 38, 12 } };
int p9[][] = { { 20, 20, 30, 30 }, { 52, 78, 78, 52 } };

polygon = new int[][][] { p1, p2, p3, p4, p5, p6, p7, p8, p9, };
}

/**
* 创建一个数字管的实例。初始化为默认的宽度、高度、前景色、背景色(50,90, red, black)。
* 其中的宽度为单个字符的宽度。
*/
public Digital() {
this(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}

/**
* 创建一个数字管的实例。初始化为指定的宽度、高度和默认的前景色、背景色 (red, black)。
* 其中的宽度为单个字符的宽度。
*/
public Digital(int width, int height) {
this(width, height, DEFAULT_FOREGROUND, DEFAULT_BACKGROUND);
}

/**
* 创建一个数字管的实例。初始化为指定的宽度、高度、前景色、背景色。 其中的宽度为单个字符的宽度。
*/
public Digital(int width, int height, Color foreground, Color background) {
this.width = width;
this.height = height;

this.foreground = foreground;
this.background = background;

this.gap = 10;
this.offset = 0;

for (int i = 0; i < polygonArray.length; ++i) {
polygonArray[i] = new Polygon(polygon[i][0], polygon[i][1], polygon[i][0].length);
}

resetRatio();
}

/**
* 在指定位置画一个字符串。
* @param g 图形设备
* @param x 起始 X 坐标
* @param y 起始 X 坐标
* @param str 需要绘制的字符串。
*/
public void draw(Graphics g, int x, int y, String str) {

if (str == null || str.equals("")) {
return;
}
int strCount = str.length();
int strWidth = strCount * width + (strCount - 1) * gap + Math.abs(offset);
int rectX = offset > 0 ? x : x + offset;

Color oldColor = g.getColor();
g.setColor(background);
g.fillRect(rectX, y, strWidth, height);

//
for (int i = 0; i < str.length(); ++i) {
drawChar(g, x, y, str.charAt(i));
x += gap + width;
}

g.setColor(oldColor);
}

/**
* 在指定位置画一个字符。
* @param g 图形设备
* @param x 起始 X 坐标
* @param y 起始 X 坐标
* @param str 需要绘制的字符。
*/
public void drawChar(Graphics g, int x, int y, char ch) {
int bits = getBits(ch);
for (int i = 0; i < 9; ++i) {
if (((bits >> i) & 1) != 0) {
drawPloygon(g, polygonArray[i], x, y);
}
}

}

/**
* 重新设置单个字符的宽度
*/
public void setWidth(int w) {
this.width = w;
resetRatio();
}

/**
* 重新设置单个字符的高度
*/
public void setHeight(int h) {
this.height = h;
resetRatio();
}

/**
* 重新设置前景色
*/
public void setForeground(Color fg) {
foreground = fg;
}

/**
* 重新设置背景色
*/
public void setBackground(Color bg) {
background = bg;
}

/**
* 设置字符的倾斜偏移
*/
public void setOffset(int o) {
this.offset = o;
resetRatio();
}

/**
* 设置字符之间的间隔
*/
public void setGap(int gap) {
this.gap = gap;
}

private void drawPloygon(Graphics g, Polygon p1, int x, int y) {
g.translate(x, y);

g.setColor(foreground);
g.fillPolygon(p1);
g.setColor(background);
g.drawPolygon(p1);

g.translate(-x, -y);
}

private int getBits(char ch) {
if (ch >= 'a' && ch <= 'z') {
ch = (char) ('A' + (ch - 'a'));
}

bits[bits.length - 1][0] = ch;

int i = 0;
while (bits[i][0] != ch) {
++i;
}
return bits[i][1];
}

private void resetRatio() {
double wRatio = (double) width / (double) DEFAULT_WIDTH;
double hRatio = (double) height / (double) DEFAULT_HEIGHT;
double offsetRatio = (double) offset / (double) DEFAULT_HEIGHT;

for (int j = 0; j < polygonArray.length; ++j) {
Polygon p = polygonArray[j];
for (int i = 0; i < p.xpoints.length; ++i) {
p.ypoints[i] = (int) (hRatio * polygon[j][1][i]);
p.xpoints[i] = (int) (wRatio * polygon[j][0][i]) + (int) (offsetRatio * (height - p.ypoints[i]));
}
}
}
}

测试程序如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
* DigitalTest
*/
public class DigitalTest extends JPanel {

Digital dg1;
Digital dg2;
Digital dg3;

public DigitalTest() {
super();
dg1 = new Digital();
dg1.setGap(15);

dg2 = new Digital(75, 135);

dg3 = new Digital(50, 90, Color.yellow, Color.blue);
dg3.setOffset(15);
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);

// draw digital string;
dg1.draw(g, 0, 0, String.valueOf(1234567890));
dg2.draw(g, 0, 120, "abcdef-:");
dg3.draw(g, 0, 270, "9:24 am");

}

public static void main(String[] args) {
final JFrame frm = new JFrame("digital test");
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Container c = frm.getContentPane();
c.setLayout(new BorderLayout());

DigitalTest digital = new DigitalTest();
c.add(digital, "Center");

frm.setSize(700, 500);
frm.setLocationRelativeTo(null);
frm.show();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐