浏览 2603 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-07
按照http://www.iteye.com/topic/77387《在win32下编译charva,运行DEMO的一个小实验》一文,编译,发布即可看到效果。 对比发现,charva 实现了swing/awt除图形控件外的所有输出控件界面。因此在开发过程中,只要不用到图形控件,切换成charva应该是没有任何问题。 以JButton为例,我们来看看,是如何画出图形来的: JPanel southPanel = new JPanel(); JButton cancelButton = new JButton(); cancelButton.setText("Cancel"); southPanel.add(cancelButton, null); 在用swing组件的时候,会从JFram开始,一层层调用子节的Paint方法。 在用charva组件的时候,同样会从JFram开始,一层层调用子节的Draw方法。 针对charva的JButton组件我们可以看到: public void draw() { super.draw(); 。。。。。。 Toolkit term = Toolkit.getDefaultToolkit(); term.setCursor(origin); 。。。。。。 term.addString(">", 0, colorpair); } 首先调用 super.draw();画出边框,然后计算坐标,画出字符串。 Toolkit term = Toolkit.getDefaultToolkit(); term.addString(" ", Toolkit.A_REVERSE, colorpair); 可以看到,真正在画界面的时候,都是调用Toolkit类画出数据到界面。 打开Toolkit.java public native void addString(String str_, int attrib_, int colorpair_); 我们可以看到,该方法是Native的。 在Tookit.c文件中,我们看到了Java_charva_awt_Toolkit_addString方法,该方法就是Toolkit.java的addString的实现。 好了,到此,不考虑底层的绘制过程,我们就知道了charva是如何工作了。 在DOS下,发现绘制的右边框不对齐,而且宽度太大,查看JComponent类的draw方法: if (_border != null) { _border.paintBorder(this, 0, origin.x, origin.y, this.getWidth(), this.getHeight()); } 可以看到,宽度计算的时候,是调用this.getWidth()取得的。继续找,在JButton中,看到了getWidth的实现。 public int getWidth() { Insets insets = super.getInsets(); return super.getLabelString().length() + 2 + insets.left + insets.right; } 哈哈,发现问题关键所在了,长度计算的时候,他是根据数据字符串的长度,加上Insets的对象的左右距离计算出总长度。 恩,看到问题解决的曙光了。考虑到,并排的几个对象,虽然字符长度不一样,不过,我们希望画出来的宽度是一样的,那么问题解决只能去找Insets对象了。Insets又是根据Border对象计算来的,那么,我们的重点就是解决Border了。如何修改Border,目前还没研究Border是如何工作的。下次再来研究,不过总算找到入口了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |