`
xiaozhonghua
  • 浏览: 252823 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Swing小练手:创建中国式凭证

阅读更多

做ERP或财务软件的朋友知道,中国式的凭证录入界面需要一些特殊的显示效果:录入金额的单元格要显示一些数字分割线。估计这个风格来自老式的手工记账本,因为我还隐约的记得当年从生产队仓库里面偷来的账本就是这个样子滴。为了继续与“Swing很丑”的偏见做斗争,持续弘扬Java的创新精神,以及“活到老学到老”、天行健程序员天天练习不息、“除了老婆一切都可共享”的做人原则,这里特意用Swing写了一个小例子,实现“中国式”的凭证录入界面,供大伙消遣。

 


 

这里面主要用到了Swing Table的Renderer和Editor这两个机制,也是Swing比较有代表性的技术,大家都不陌生。对于熟悉这个机制的童鞋来说,本文实在没什么新意。这里也就不啰嗦废话了,直奔主题,点到为止,然后上代码。

 

用下面代码设置table一个列的renderer和editor:

 

table.getColumnModel().getColumn(2).setCellRenderer(new MoneyRenderer());
table.getColumnModel().getColumn(2).setCellEditor(new MoneyEditor());

 在renderer中,首先paint纵向的竖线,然后在paint正常的单元格内容。

 

@Override
public void paintChildren(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    painter.paint(this, g2d, null);
    super.paintComponent(g);
}

 其中,painter是一个封装好的用来画竖线的类。里面说道:

 

public class LinePainter {

    private Stroke normalStroke = new BasicStroke(1);
    private Stroke thickStroke = new BasicStroke(1);
    private Color normalColor = Color.lightGray;
    private Color tickColor = Color.cyan.darker();
    private Color decimalColor = Color.red;

    public void paint(JComponent component, Graphics2D g, Color lineColor) {
        g.setColor(Color.gray);
        g.setFont(component.getFont());
        Rectangle2D bounds = g.getFontMetrics().getStringBounds("0", g);
        int unitWidth = (int) bounds.getWidth();

        int x = component.getWidth();
        int rightGap = 0;
        if (component.getInsets() != null) {
            rightGap = component.getInsets().right;
        }
        if (component.getBorder() != null) {
            rightGap = rightGap + component.getBorder().getBorderInsets(component).right;
        }
        if (component instanceof JTextComponent) {
            JTextComponent textComponent = (JTextComponent) component;
            Insets insets = textComponent.getMargin();
            rightGap = rightGap + insets.right;
            rightGap = rightGap + 2;
        }

        x = x - rightGap;

        int index = 0;
        while (x > unitWidth * 2) {
            x = x - unitWidth;
            if (index == 1) {
                g.setStroke(thickStroke);
                g.setColor(decimalColor);
            } else {
                if ((index - 1) % 3 == 0) {
                    g.setColor(tickColor);
                } else {
                    g.setColor(normalColor);
                }
                g.setStroke(normalStroke);
            }
            g.drawLine(x, 0, x, component.getHeight());
            index++;
        }
        if (lineColor != null) {
            g.setColor(lineColor);
            g.setStroke(this.normalStroke);
            g.drawLine(0, component.getHeight() - 1, component.getWidth(), component.getHeight() - 1);
        }
    }
}

 很简单,就一个paint函数,画纵向的彩条线而已。注意间距、字体等的考虑。

 

为了在编辑期间也能显示纵向线条,所以要定制editor,且重写TextField的paint,先画线条,再super正常的内容paint:

 

@Override
public void paint(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    painter.paint(this, g2d, Color.red);
    super.paint(g);
}

 这样,整个程序就结束了。稍作修改,加上输入格式检查、汇率转换等东西,相信可以很容易的用在你家的ERP或者财务软件上。

 

俺知道这个程序可能会被扁“没技术含量”。因此给大伙扯点别的,给几个家庭作业,欢迎大家踊跃回答:

 

  1. 这张凭证记录了什么业务活动的发生?
  2. 为什么“库存商品”一栏的金额在“借方”,而“银行现金”一栏的金额在“贷方”?
  3. 为什么“进项税额”的金额是17.00元?
  4. 这里哪些科目到月底需要结转?

如果能轻松回答这几个家庭作业,说明你不仅仅是个优秀的程序员,还是个优秀的财务,嗯,至少做个出纳没问题吧!等咱写不动程序了,去工厂应聘一下出纳,不也能混口饭吃么?!COOOL

 

有童鞋抱怨看不见,整大一点:
这里下载源代码

  • 大小: 33.7 KB
分享到:
评论
12 楼 niumd 2010-09-03  
偶给做财务的媳妇看,媳妇笑而不语;
11 楼 KimShen 2010-09-03  
LZ这几个系列文章算是twaver的软文么?
10 楼 zhajie 2010-09-03  
mybw7601 写道
1.这张凭证记录了什么业务活动的发生?
应该是现金采购
2.为什么“库存商品”一栏的金额在“借方”,而“银行现金”一栏的金额在“贷方”?
两者都是资产类科目,借代表余额增加,贷代表余额减少
3.为什么“进项税额”的金额是1700元?
是17.00元吧?应该是17%的税
4.这里哪些科目到月底需要结转?
进项税科目


3.好像是对的吧,17块的税。17.00
9 楼 qianhd 2010-09-03  
超长的输入
...的出现 如何处理比较好?
8 楼 zhujinguo 2010-09-03  
xiaozhonghua果然是牛人,不知高龄几何啊?
7 楼 norwind 2010-09-03  
太威武了。
6 楼 zhengbiao5 2010-09-03  
xiaozhonghua jiayou!
5 楼 xiaozhonghua 2010-09-03  
mybw7601 写道
1.这张凭证记录了什么业务活动的发生?
应该是现金采购
2.为什么“库存商品”一栏的金额在“借方”,而“银行现金”一栏的金额在“贷方”?
两者都是资产类科目,借代表余额增加,贷代表余额减少
3.为什么“进项税额”的金额是1700元?
是17.00元吧?应该是17%的税
4.这里哪些科目到月底需要结转?
进项税科目

哈哈厉害!Java+财务双料选手,相当于能同时打姚明和韦伯两个位置!
4 楼 mybw7601 2010-09-03  
1.这张凭证记录了什么业务活动的发生?
应该是现金采购
2.为什么“库存商品”一栏的金额在“借方”,而“银行现金”一栏的金额在“贷方”?
两者都是资产类科目,借代表余额增加,贷代表余额减少
3.为什么“进项税额”的金额是1700元?
是17.00元吧?应该是17%的税
4.这里哪些科目到月底需要结转?
进项税科目
3 楼 xianhe 2010-09-03  
家庭作业我能轻松回答,不过没人会聘我,唉
2 楼 wenfeilinux 2010-09-03  
做一下作业,
你不是写了采购么?
1 楼 knightc 2010-09-03  
没办法,只能用变态来形容了。这种样子搞得个真实纸张都没区别了啊。

相关推荐

    java-ssm+vue旅游资源网站实现源码(项目源码-说明文档)

    旅游资源网站的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、景点信息管理、购票信息管理、酒店信息管理、客房类型管理、客房信息管理、客房预订管理、交流论坛、系统管理,用户:首页、个人中心、购票信息管理、客房预订管理、我的收藏管理,前台首页;首页、景点信息、酒店信息、客房信息、交流论坛、红色文化、个人中心、后台管理、客服等功能。 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 后端技术:ssm 前端技术:Vue 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog

    【高创新】基于粒子群优化算法PSO-Transformer-BiLSTM实现故障识别Matlab实现.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    这里收集那些神奇的产品经理为我们带来的意想不到的产品功能和改版,又称_MDZZ_PM_awesome-pm.zip

    这里收集那些神奇的产品经理为我们带来的意想不到的产品功能和改版,又称_MDZZ_PM_awesome-pm

    AI City track 5数据集-voc-xml格式

    有戴头盔的人、未戴头盔的人、摩托车三种类别,包含736张图像、对应voc格式标签(xml)

    4-3_Business_BLUE_2017_16-CL-20180524MTAX.potx

    微软演示材料

    VB075期刊信息管理系统(SQL).7z

    VB075期刊信息管理系统(SQL).7z

    西门子SMART200程序 PID的控制写法,突破8路,PID直接做成子程序,无密码,直接调用

    西门子SMART200程序 PID的控制写法,突破8路,PID直接做成子程序,无密码,直接调用。

    VBATM校园自动银行系统设计(源代码+论文).zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、5资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    基于深度学习的移动物体检测分类源码

    基于YOLOv5的物体检测识别与分类系统,可根据不同的权重模型对不同的物体进行识别,整体分为图片、视频和摄像头三个检测模块,具体检测能力依据模型而定。

    PMSM滑模控制仿真无位置 永磁电机 可提供文档if启动 如果没有收敛,将1e-4搞小一点 e-6或者e-5试下 本次滑模模型

    PMSM滑模控制仿真无位置 永磁电机 可提供文档if启动 如果没有收敛,将1e-4搞小一点 e-6或者e-5试下 本次滑模模型文档包括: 1 simulink界面调整,由于使用这个仿真的时候很可能会出现因为软件环境不同导致无法使用, 或者导致的波形错误,特写了一个关于参数界面的设置,按照那个设置,结合主框图,能够 避免使用出问题。 2 波形记录,将转速波形,转矩波形,位置估计+实际位置波形,三项定子电流波形, 给定转速(蓝绿色)+实际转速(红色)+估算转速(蓝色) 3 另外仿真程序内部,里面标注了各个功能模块的位置及部分原理。 4 lunwen的话推荐看 13 16 开头的lunwen,其他的可以拓展性的看。

    60-AspNet8-jQery-Datatables-5-Code.zip

    构建使用jQuery组件DataTables.net的Asp.Net 8 MVC应用程序的实用指南。

    皮层微创脑机接口传感器的发展现状与未来趋势

    内容概要:文章探讨了皮层微创脑机接口(BCI)传感器作为神经电信号采集与调控装置,在临床上的应用现状与科研进展,并分析了传感器在未来可能的发展趋势和技术革新点。介绍了现有商业化及实验级别的电极器材,并讨论了其如何进一步向着高通量、软界面与更持久的生命设计演化。 适合人群:神经工程专业科研工作者,尤其是关注BCI传感器领域的研究生、教师和其他相关专业的科研人士。 使用场景及目标:旨在增进从业者对于皮层微创BCI的理解,特别是传感器的设计、制作工艺和未来可能的方向;有助于科研与产品研发。 其他说明:文章还强调了技术创新在材料与设计理念层面的重要性,为BCI传感器在实际医疗与神经科研中发挥作用打下了坚实的基础。

    基于python实现的社会力模型仿真+源码+文档(毕业设计&课程设计&项目开发)

    基于python实现的社会力模型仿真+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于python实现的社会力模型仿真+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于python实现的社会力模型仿真+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于python实现的社会力模型仿真+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于python实现的社会力模型仿真+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于python实现的社会力模型仿真+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~

    2024.9.18 作业

    2024.9.18 作业

    Python环境一键安装脚本,适用于Linux_lxspacepy.zip

    Python环境一键安装脚本,适用于Linux_lxspacepy

    昕一 - 一样的月光 [qmms2].mp3

    昕一 - 一样的月光 [qmms2].mp3

    【高创新】基于凌日优化算法TSOA-Transformer-BiLSTM实现故障识别Matlab实现.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    http服务器的实现.7z

    http服务器的实现.7z

    java-ssm+vue高校奖学金管理系统实现源码(项目源码-说明文档)

    高校奖学金管理系统的主要实现功能包括:管理员:首页、个人中心、学生管理、辅导员管理、教务处管理、奖学金类型管理、奖学金信息管理、学生成绩管理、奖惩信息管理、奖学金申请管理、公告信息管理。学生:首页、个人中心、奖学金信息管理、学生成绩管理、奖惩信息管理、奖学金申请管理、公告信息管理,辅导员;首页、个人中心、学生管理、学生成绩管理、奖惩信息管理、奖学金申请管理、公告信息管理,教务处;首页、个人中心、学生管理、学生成绩管理、奖惩信息管理、奖学金申请管理、公告信息管理 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 后端技术:ssm 前端技术:Vue 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog

    Palo Alto Networks PA-220 管理员指导手册

    Palo Alto Networks PA-220 管理员指导手册

Global site tag (gtag.js) - Google Analytics