`
xiaozhonghua
  • 浏览: 253776 次
  • 性别: 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
分享到:
评论
32 楼 jprobe 2010-12-03  
下不了,怎么整广告去了
31 楼 congjl2002 2010-10-26  
que1 写道
学习下,太强了。

记得U8用VB做财务软件,还专门用VC++做了这种凭证图,后来用的ERP系统,干脆就没有这种凭证图了,直接是个文本框.....


U8是没有表头的数位文字的,呵呵
30 楼 que1 2010-10-11  
学习下,太强了。

记得U8用VB做财务软件,还专门用VC++做了这种凭证图,后来用的ERP系统,干脆就没有这种凭证图了,直接是个文本框.....
29 楼 xiaozhonghua 2010-09-24  
congjl2002 写道
确实非常的牛,我在次基础上又增加了点改进,只是在显示上,编辑状态下未改动,看一下结果:

哈哈相当帅!厉害!
28 楼 congjl2002 2010-09-22  
代码不方便公开,呵呵,大家在网上搜搜吧
27 楼 congjl2002 2010-09-22  
确实非常的牛,我在次基础上又增加了点改进,只是在显示上,编辑状态下未改动,看一下结果:
26 楼 guduxing890 2010-09-14  
Swing 无所不能!
25 楼 congjl2002 2010-09-14  
还有一个问题,就是一般在表头也应该有 分,角,元 这样的文字,请问如何实现,谢谢
24 楼 shuiguozheng 2010-09-06  
看不懂。。。。 ,没做过这类软件
23 楼 idefeng 2010-09-06  
需要有相关专业知识啊。
22 楼 comsci 2010-09-06  
好漂亮的界面,老大用什么设计器做的?NB还是JB?
21 楼 weizh 2010-09-04  
代码还可以,不过这样的凭证一般出现在会计书里,现实中还是不靠谱的。
20 楼 kenken0y 2010-09-04  
mybw7601 写道

4.这里哪些科目到月底需要结转?
进项税科目

进项税科目应该也不用结转的吧,只有收入,成本费用类科目需要结转
参照 http://zhidao.baidu.com/question/148605794
19 楼 qianhd 2010-09-04  
关于技术群 一般都是白痴建群 艾斯比加群
18 楼 xiaozhonghua 2010-09-04  
zhajie 写道
mybw7601 写道
1.这张凭证记录了什么业务活动的发生?
应该是现金采购
2.为什么“库存商品”一栏的金额在“借方”,而“银行现金”一栏的金额在“贷方”?
两者都是资产类科目,借代表余额增加,贷代表余额减少
3.为什么“进项税额”的金额是1700元?
是17.00元吧?应该是17%的税
4.这里哪些科目到月底需要结转?
进项税科目


3.好像是对的吧,17块的税。17.00

哈哈,是17块,不是1700块,已经更正!谢谢!!
17 楼 njnu_zhoubo 2010-09-04  
xujunJ2EE 写道
为了响应小中华宣传swing的号召,最近准备作个网络监管的小程序,不使用Twaver,作个山寨版,哈哈

做网管,用swing很多啊,貌似华为就用twaver的
16 楼 skzr.org 2010-09-04  
ssuupv 写道
swing桌面应用,还是相当多.很多应用纯swing开发,摆在人们面前,他们会有怀疑眼神看着,这是swing开发的.

我们公司做行业应用的,当初的产品来自swing,后面上asp,最后定位在j2ee,不过越来越多好的东西没有积累下来
有6年的历史了,如果一直坚持swing,相信用6年做一个产品可以达到其他竞争对手仰望的高度。
被技术忽悠了的飘过
^ ^借此帖感慨感慨,一直觉得swing,很好很强大:看中的是在java后面的庞大开源解决方案——大批的可用积木
和作为软件资产的可重复利用
深有体会,积累才是硬道理,随着时间的推移,产品的成长、完善都是一步一个脚印。切忌贪功西北
15 楼 ssuupv 2010-09-04  
swing桌面应用,还是相当多.很多应用纯swing开发,摆在人们面前,他们会有怀疑眼神看着,这是swing开发的.
14 楼 xujunJ2EE 2010-09-04  
为了响应小中华宣传swing的号召,最近准备作个网络监管的小程序,不使用Twaver,作个山寨版,哈哈
13 楼 pan_这名还行 2010-09-04  
小中华哥威武

相关推荐

    Java swing小游戏,纯练手.zip

    Java swing小游戏,纯练手Java swing小游戏,纯练手Java swing小游戏,纯练手 Java swing小游戏,纯练手Java swing小游戏,纯练手Java swing小游戏,纯练手 Java swing小游戏,纯练手Java swing小游戏,纯练手Java ...

    SWING大刀系列源码

    主题:Swing是一把刀 http://www.iteye.com/topic/702804 主题:Swing第二刀:枝间新绿一重重 http://www.iteye.com/topic/707540 主题:Swing第二小刀刀:星星之火可以燎原 http://www.iteye.com/topic/707514 ...

    Swing第三刀:做套ERP,要配得上我的登录界面

    Swing第三刀:做套ERP,要配得上我的登录界面

    基于Swing应用程序设计:一个简易的文本编辑框

    As a professional in the IT field, I'll be detailing the knowledge points from the given title, description, and tags, specifically focusing on creating a simple text editor using Swing in Java. ...

    Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(二)

    NULL 博文链接:https://yshjava.iteye.com/blog/1326539

    精通java-swing开发.doc

    这个库主要围绕着`javax.swing`包展开,它提供了丰富的组件、布局管理器以及事件处理机制,使得开发者可以创建出复杂的桌面应用。 Swing中的组件大多数是从`JComponent`类派生出来的,这意味着它们是轻量级组件...

    JavaSwing练手项目之信息管理系统

    JavaSwing练手项目之信息管理系统是一个非常适合初学者学习的实践项目,主要目的是通过实际操作来熟悉和掌握JavaSwing库在开发桌面应用程序时的应用。JavaSwing是Java的一个组件库,用于创建图形用户界面(GUI),它...

    JavaSwing小程序

    Swing 提供了一系列组件,如按钮、文本框、菜单等,使得开发者能够创建功能丰富的、交互式的用户界面。在本JavaSwing小程序中,我们可能涉及到Swing的基本用法、组件使用、布局管理以及事件处理等多个知识点。 1. *...

    Java-Swing-Maven:创建一组项目来演示Java,Swing和Maven的用法

    理解并熟练使用布局管理器是创建美观且响应式的GUI的关键。 9. **版本控制**:由于文件名中提到的“master”,这可能表明项目使用了Git进行版本控制。Git是一种分布式版本控制系统,用于跟踪代码更改,协作开发,并...

    Java中Swing.pdf

    Java Swing是Java平台上用于构建图形用户界面(GUI)的工具包,它是基于早期的AWT(Abstract Window Toolkit)进行扩展和改进的。Swing提供了丰富的组件库,这些组件全部由Java语言实现,因此具有平台无关性,能够在...

    swing教程之经典

    - **示例1:简单Swing应用程序**:创建一个包含按钮和标签的简单窗口,展示如何使用Swing组件创建基本的GUI界面。 - **示例2:使用Swing创建复杂的应用程序**:演示如何利用Swing的丰富功能,如表格、列表、树状视图...

    Java Swing 小工具界面框架

    这个“Java Swing 小工具界面框架”是一个用于创建简单应用程序界面的示例,适合初学者学习Swing的基本用法。下面将详细阐述Swing的相关知识点。 1. **Swing组件**:Swing提供了多种组件,如按钮(JButton)、...

    Swing小管理项目源码

    【Swing小管理项目源码】是一个基于Java Swing开发的桌面应用程序示例,它涵盖了多个核心功能,包括用户界面的设计、数据操作以及交互逻辑。Swing是Java的标准库,用于构建图形用户界面(GUI),提供了丰富的组件库...

    swing-layout-1.0.3

    swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3...

Global site tag (gtag.js) - Google Analytics