做ERP或财务软件的朋友知道,中国式的凭证录入界面需要一些特殊的显示效果:录入金额的单元格要显示一些数字分割线。估计这个风格来自老式的手工记账本,因为我还隐约的记得当年从生产队仓库里面偷来的账本就是这个样子滴。为了继续与“Swing很丑”的偏见做斗争,持续弘扬Java的创新精神,以及“活到老学到老”、天行健程序员天天练习不息、“除了老婆一切都可共享”的做人原则,这里特意用Swing写了一个小例子,实现“中国式”的凭证录入界面,供大伙消遣。
![](http://dl.iteye.com/upload/attachment/303173/0ea938c3-e999-3bee-b44d-a397f31ed020.png)
这里面主要用到了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或者财务软件上。
俺知道这个程序可能会被扁“没技术含量”。因此给大伙扯点别的,给几个家庭作业,欢迎大家踊跃回答:
- 这张凭证记录了什么业务活动的发生?
- 为什么“库存商品”一栏的金额在“借方”,而“银行现金”一栏的金额在“贷方”?
- 为什么“进项税额”的金额是17.00元?
- 这里哪些科目到月底需要结转?
如果能轻松回答这几个家庭作业,说明你不仅仅是个优秀的程序员,还是个优秀的财务,嗯,至少做个出纳没问题吧!等咱写不动程序了,去工厂应聘一下出纳,不也能混口饭吃么?!COOOL
有童鞋抱怨看不见,整大一点:
这里下载源代码
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0030/3173/0ea938c3-e999-3bee-b44d-a397f31ed020-thumb.png)
- 大小: 33.7 KB
分享到:
相关推荐
Java swing小游戏,纯练手Java swing小游戏,纯练手Java swing小游戏,纯练手 Java swing小游戏,纯练手Java swing小游戏,纯练手Java swing小游戏,纯练手 Java swing小游戏,纯练手Java swing小游戏,纯练手Java ...
主题:Swing是一把刀 http://www.iteye.com/topic/702804 主题:Swing第二刀:枝间新绿一重重 http://www.iteye.com/topic/707540 主题:Swing第二小刀刀:星星之火可以燎原 http://www.iteye.com/topic/707514 ...
Swing第三刀:做套ERP,要配得上我的登录界面
NULL 博文链接:https://yshjava.iteye.com/blog/1326539
利用JavaSwing来制作的超市信息管理系统,主要包括用户管理 职工管理 客户管理 供应商管理 和入库和出库管理。非常简单的系统 非常适合初学者的练习,希望大家喜欢。
Java-Swing-Maven 创建一组项目来演示Java,Swing和Maven的用法
资源名称:Java2 图形设计 卷Ⅱ:Swing 内容简介:Swing是一流的Java图形用户界面开发工具。本书详细介绍了Swing的设计思想、体系结构、使用技巧,内容丰富、深入细致、分析透彻。本书用大量实例代码介绍了每个组件...
利用swing组件来显示系统文件的目录树,不使用JFileChooser类。
swing小黑点移动 swing小黑点移动 swing小黑点移动 swing小黑点移动 swing小黑点移动 swing小黑点移动
swing入门教程
Swing大刀系列: 1.1 Swing是一把刀 1.2 Swing第二刀:枝间新绿一重重 1.3 Swing第三刀:做套ERP,要配得上我的登录界面! 1.4 Swing第四刀:代码尽散换芳华 1.5 Swing第五刀:走马观花看世博 1.6 Swing第六刀:老婆...
Java Swing组件:Jlist学习笔记Java Swing组件:Jlist学习笔记
java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源...
Swing 编程边框(Border)的用法总结 Swing 编程边框(Border)是 Java 中一个常用的 UI 组件,用于设置控件的边框样式。通过 setBorder 方法可以设置边框,该方法是 JComponent 类的成员方法。 BorderFactory 是一个...
一款Java Swing小程序,借助Window Builder Editor,界面拖拽实现,简单高效。代码适用于学习java swing的小伙伴参考借鉴。