package t1lp.gui;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
/**
* 绘制计算器LCD液晶显示面板,派生自JPanel
*
* @author Brownlzy
* @version 1.0
*/
class LcdScreen extends JPanel {
private JLabel labNumber; //显示LED图片的JLabel控件
private LedNumber ledNumber; //用于生成LED数字图片的对象
private LedLabel labFunction; //显示数制、E标的JLabel控件
/**
* 构造函数,初始化UI
*
* @author Brownlzy
*/
public LcdScreen() {
initGUI();
//修改Swing显示风格为Windows
String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
try {
UIManager.setLookAndFeel(lookAndFeel);
} catch (Exception e1) {
e1.printStackTrace();
}
SwingUtilities.updateComponentTreeUI(LcdScreen.this);
}
/**
* 初始化LCD面板UI
*
* @author Brownlzy
*/
private void initGUI() {
//设置边框布局
this.setLayout(new BorderLayout());
labNumber = new JLabel();
//初始化对象,设置生成LED图片颜色
ledNumber = new LedNumber(Color.black, new Color(240, 240, 240), Color.white, 36, 63, 7);
//添加到上方
this.add(labNumber, BorderLayout.NORTH);
labFunction = new LedLabel();
//添加到下方
this.add(labFunction, BorderLayout.SOUTH);
}
/**
* 修改LED数字显示内容
*
* @param strLedNumber 新的LED数字字符串 NUM0d123456789.0
* @author Brownlzy
*/
public void changeLedNumber(String strLedNumber) {
if (isMyNumber(strLedNumber)) { //是符合标准的数字
int scale = getScale(strLedNumber);
//使数字符合LED显示的宽度
String number = strLedNumber.substring(5);
//显示数字,宽度为9
labNumber.setIcon(new ImageIcon(ledNumber.getLedImage(number, 9)));
labFunction.changeState(scale);
} else { //不符合标准,抛出错误
System.out.println(strLedNumber);
throw new UnsupportedOperationException();
}
}
/**
* 获取数制信息
*
* @param strLedNumber 数字(NUM0d123456789.0)
* @return int
* @author Brownlzy
*/
private int getScale(String strLedNumber) {
switch (strLedNumber.charAt(4)) {
case 'd':
return 10;
case 'o':
return 8;
case 'x':
return 16;
default:
throw new UnsupportedOperationException();
}
}
/**
* 判断数字字符串是否符号标准
*
* @param strLedNumber 数字(NUM0d123456789.0)
* @return boolean
* @author Brownlzy
*/
private boolean isMyNumber(String strLedNumber) {
if (strLedNumber.startsWith("NUM0")) {
switch (strLedNumber.charAt(4)) {
case 'd':
for (int i = 5; i < strLedNumber.length(); i++) {
if (!"-0123456789.E".contains(String.valueOf(strLedNumber.charAt(i))))
return false;
}
return true;
case 'x':
for (int i = 5; i < strLedNumber.length(); i++) {
if (!"0123456789ABCDEFabcdef.".contains(String.valueOf(strLedNumber.charAt(i))))
return false;
}
return true;
case 'o':
for (int i = 5; i < strLedNumber.length(); i++) {
if (!"01234567E.".contains(String.valueOf(strLedNumber.charAt(i))))
return false;
}
return true;
default:
return false;
}
} else {
return false;
}
}
/**
* 修改LCD功能区显示状态
*
* @param isError 是否出现错误
* @author Brownlzy
*/
void changeLedState(boolean isError) {
labFunction.changeState(isError);
}
/**
* 隐藏LCD屏内容
*
* @author Brownlzy
*/
void hideMe() {
labNumber.setVisible(false);
labFunction.setVisible(false);
}
/**
* 显示LCD屏内容
*
* @author Brownlzy
*/
void showMe() {
labNumber.setVisible(true);
labFunction.setVisible(true);
}
/**
* 显示计算器功能区状态的JLabel
*
* @author Brownlzy
* @version 2.0
*/
static class LedLabel extends JLabel {
private boolean isError; //是否显示E标
private int scale; //当前进制
/**
* 构造函数
*
* @author Brownlzy
*/
public LedLabel() {
isError = false;
scale = 10;
this.setFont(new Font("Consolas", Font.BOLD, 18));
}
/**
* 设置成员变量
*
* @param scale 进制
* @author Brownlzy
*/
public void changeState(int scale) {
this.scale = scale;
refreshText();
}
/**
* 设置成员变量
*
* @param isError E标
* @author Brownlzy
*/
public void changeState(boolean isError) {
this.isError = isError;
refreshText();
}
/**
* 刷新LCD状态区显示文本
*
* @author Brownlzy
*/
private void refreshText() {
String funText = " E DEC HEX OCT ";
if (!isError) funText = funText.replace(" E ", " ");
if (scale != 16) funText = funText.replace("HEX", " ");
if (scale != 10) funText = funText.replace("DEC", " ");
if (scale != 8) funText = funText.replace("OCT", " ");
this.setText(funText);
}
}
/**
* 绘制LED液晶数字与部分字符
*
* @author Brownlzy
* @version 1.0
*/
static class LedNumber extends Component {
private Polygon[] segmentPolygon; //储存7个二极管轮廓
/*
----- --0--
| | 5 1
----- --6--
| | 4 2
----- --3--
*/
private final 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
{0, 1, 2, 4, 5, 6}, //A
{2, 3, 4, 5, 6}, //b
{0, 3, 4, 5}, //C
{1, 2, 3, 4, 6}, //d
{0, 3, 4, 5, 6}, //E
{0, 4, 5, 6}, //F
{6}, //-
{} //
}; //储存每个字符需要点亮的二极管ID
private Image[] numberImage; //储存所有LED字符的图片
private final Color fontColor; //字体颜色
private final Color bgColor; //背景颜色
private final Color maskColor; //未点亮二极管颜色
private final int dWidth; //单个数字宽度
private final int dHeight; //数字高度
private final int dGasp; //数字之间的间隔
/**
* 构造函数,设置生成的Led数字的参数
*
* @param fc 字体颜色
* @param bgc 背景颜色
* @param mc 遮盖颜色
* @param width 数字宽度
* @param height 数字高度
* @param gasp 数字之�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 Java大作业基于JavaSwing实现的模拟程序员计算器源码+项目说明.zip 课题要求: 基本要求: `已完成`按照TI 程序员计算器(1982 年LCD版本)的原始面板键盘和显示布局设计出计算器的交互窗口. `已完成`实现 10 进制和 16 进制的基础算术运算。即不含括号的单步加减乘除运算。 提高要求: `已完成`实现输入的 10 进制数和 16 进制数之间的相互转换 `已完成`实现与、或、异或、 `已完成`反码、补码和移位运算 `已完成`实现单一进制模式下的带括号的组合多步运算 `已完成`实现混合进制模式下带括号的组合多步运算 `已完成`设计运算溢出等出错提示。 备注 课题要求中给出的基本要求和提高要求将作为评分依据,根据大作 业评分标准进行评分,在基本要求和提高要求以外实现的其它功能不作为评分依据。 本大作业课题中设计实现的计算器不需要进行以八进制以及二进制输入输出的数据转 换或计算。 【备注】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈!
资源推荐
资源详情
资源评论
收起资源包目录
Java大作业基于JavaSwing实现的模拟程序员计算器源码+项目说明.zip (21个子文件)
项目说明.md 1KB
src
t1lp
calculator
MyNumber.java 14KB
Operator.java 5KB
Calculate.java 11KB
handle
InputProcess.java 14KB
Config.java 813B
T1LcdProgrammer.java 922B
Data.java 2KB
gui
Listener.java 3KB
MainWindow.java 4KB
LcdScreen.java 15KB
ControlPanel.java 3KB
res
BackgroundImage.png 14KB
icon.png 12KB
.idea
runConfigurations.xml 337B
vcs.xml 180B
misc.xml 848B
compiler.xml 233B
modules.xml 248B
.gitignore 176B
T1LP.iml 423B
共 21 条
- 1
资源评论
北航程序员小C
- 粉丝: 2260
- 资源: 1825
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功