当前位置: 首页 > 工具软件 > charva > 使用案例 >

charva实现原理初探(不知道如何归类了,没有J2SE类别)

洪哲彦
2023-12-01
在Eclipse上,先按一般的swing程序开发,画出界面。在需要切换到终端的时候,修改Import部分,修改成import charva.*****即可。
按照[url]http://www.iteye.com/topic/77387[/url]《在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组件我们可以看到:
[code]
public void draw() {

super.draw();
。。。。。。
Toolkit term = Toolkit.getDefaultToolkit();
term.setCursor(origin);
。。。。。。
term.addString(">", 0, colorpair);
}
[/code]
首先调用 super.draw();画出边框,然后计算坐标,画出字符串。
[code]
Toolkit term = Toolkit.getDefaultToolkit();
term.addString(" ", Toolkit.A_REVERSE, colorpair);
[/code]
可以看到,真正在画界面的时候,都是调用Toolkit类画出数据到界面。
打开Toolkit.java
[code]
public native void addString(String str_, int attrib_, int colorpair_);
[/code]
我们可以看到,该方法是Native的。
在Tookit.c文件中,我们看到了Java_charva_awt_Toolkit_addString方法,该方法就是Toolkit.java的addString的实现。
好了,到此,不考虑底层的绘制过程,我们就知道了charva是如何工作了。

在DOS下,发现绘制的右边框不对齐,而且宽度太大,查看JComponent类的draw方法:
[code]
if (_border != null) {
_border.paintBorder(this, 0,
origin.x, origin.y,
this.getWidth(), this.getHeight());
}
[/code]
可以看到,宽度计算的时候,是调用this.getWidth()取得的。继续找,在JButton中,看到了getWidth的实现。
[code]
public int getWidth() {
Insets insets = super.getInsets();
return super.getLabelString().length() + 2 + insets.left + insets.right;
}
[/code]
哈哈,发现问题关键所在了,长度计算的时候,他是根据数据字符串的长度,加上Insets的对象的左右距离计算出总长度。
恩,看到问题解决的曙光了。考虑到,并排的几个对象,虽然字符长度不一样,不过,我们希望画出来的宽度是一样的,那么问题解决只能去找Insets对象了。Insets又是根据Border对象计算来的,那么,我们的重点就是解决Border了。如何修改Border,目前还没研究Border是如何工作的。下次再来研究,不过总算找到入口了。 :D
 类似资料: