论坛首页 Java企业应用论坛

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

浏览 2603 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-07  
在Eclipse上,先按一般的swing程序开发,画出界面。在需要切换到终端的时候,修改Import部分,修改成import charva.*****即可。
按照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是如何工作的。下次再来研究,不过总算找到入口了。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics