`
lixigua
  • 浏览: 16653 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多
在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是如何工作的。下次再来研究,不过总算找到入口了。
分享到:
评论

相关推荐

    j2se实现计算器,界面优美

    在本项目中,我们关注的是一个使用Java标准版(J2SE)实现的计算器应用程序。这个计算器项目不仅提供了基本的计算功能,而且它的图形用户界面(GUI)设计得相当优美,使得用户交互体验良好。这对于那些正在学习Java ...

    J2SE_API J2SE_API

    J2SE_API、J2SE_API、J2SE_API、J2SE_API、J2SE_API、J2SE_API、J2SE_API

    【一脚揣进J2SE】视频教程(持续更新)

    资源名称:【一脚揣进J2SE】视频教程(持续更新)资源目录:【】《一脚踹进J2SE》1-1Java简介【】《一脚踹进J2SE》1-2Java运行环境搭建【】《一脚踹进J2SE》1-3HelloWorld实现及Java运行原理介绍【】《一脚踹进J2SE...

    用J2SE实现的蜘蛛纸牌游戏

    《用J2SE实现的蜘蛛纸牌游戏》 蜘蛛纸牌是一种广受欢迎的单人桌面游戏,它基于纸牌的排列和组合,挑战玩家的逻辑思维和策略能力。本项目是利用Java的标准版(J2SE)来实现的,旨在为编程爱好者提供一个了解和学习...

    J2SE基础源代码

    Java Standard Edition(J2SE)是Java平台的核心部分,它为开发和运行桌面应用程序、...通过分析和学习这些J2SE基础源代码,开发者不仅可以掌握Java编程的基础,还能深入理解其工作原理,提升编程技能和问题解决能力。

    j2se_中文版

    Java 2 Platform, Standard Edition(J2SE)是Java开发平台的一个重要组成部分,主要用于桌面应用和服务器端开发。中文版的J2SE API文档对于中国开发者来说尤其方便,它提供了全面的API参考,帮助理解并使用Java编程...

    J2SE基础知识大全

    Java 2 Platform, Standard Edition(J2SE)是Java平台的核心组成部分,主要用于桌面应用程序的开发。J2SE基础知识是每一个Java开发者必须掌握的核心技能。以下将详细阐述J2SE中的关键概念和技术。 1. **Java语言...

    j2se doc 中文版

    Java 2 Platform, Standard Edition (J2SE) 是 Oracle 公司推出的 Java 开发平台,主要用于桌面应用和服务器端开发。J2SE 文档,尤其是官方文档,是开发者学习和理解 Java 核心特性的关键资源。这个"J2SE doc 中文版...

    j2se1.5中文api

    在J2SE 1.5之前,枚举通常通过常量类实现,而J2SE 1.5引入了内置的枚举类型,使得枚举成为一种完整的类型,可以拥有方法、实现接口,增强了枚举的灵活性和安全性。例如,enum Color { RED, GREEN, BLUE }。 三、...

    j2se6中文网页版

    2. **集合框架**:J2SE 6引入了更完善的集合框架,包括List、Set、Map接口以及它们的各种实现,如ArrayList、LinkedList、HashSet、HashMap等。这些数据结构提供了强大的数据存储和操作能力,便于进行复杂的数据处理...

    j2se.rar_j2se

    首先,接口(Interface)在Java中是一种完全抽象的类,它只定义方法的签名而没有具体实现。接口是实现多继承的一种方式,允许一个类实现多个接口,从而具备多种功能。例如,文件中的“animal.java”可能包含了一个名...

    用J2SE实现原网页浏览器(java)

    本项目聚焦于使用J2SE来实现一个简单的网页浏览器,这是一个深入理解Java GUI编程和网络通信的好方法。我们将探讨如何利用Java的Swing库构建用户界面,以及如何通过HTTP协议获取并解析网页内容。 首先,我们要了解...

    J2SE复习源代码

    Java 2 Standard Edition(J2SE)是Java平台的核心部分,用于开发和运行桌面应用程序、服务器端应用以及嵌入式系统。本复习源代码涵盖了多个关键知识点,旨在帮助开发者巩固和提升在J2SE中的技能。 1. **常用类**:...

    j2se api 中文版

    这对于实现元编程、插件系统或者在不预先知道具体类型的情况下操作对象非常有用。 4. **输入/输出(I/O)**:Java的I/O系统包括文件操作、串行化、网络通信等。NIO(New IO)提供了一种非阻塞的I/O模型,适合高性能的...

    J2SE 核心类库源代码

    源代码是理解这些类库工作原理的关键,通过阅读源码,开发者可以深入学习 Java 的设计理念和实现机制。 在J2SE核心类库中,包括了许多关键模块: 1. **基础类**:如`java.lang`包,其中包含所有Java程序的基本类,...

    j2se5.0_API

    很好的j2se的API

    完整接口的实现实例,适宜J2SE初学者

    完整接口的实现实例;主要讲述接口定义的格式以及运用,适宜J2SE初学者

    j2se全部学习代码

    压缩包中的文件名看起来并不直接揭示代码内容,但根据Java学习的一般路径,这些文件可能代表不同的主题或练习,比如"Jisuanqi.java"可能是关于计算器的实现,而其他数字命名的文件可能表示不同的章节或练习题目。...

    com.google.zxing.client.j2se.jar下载

    zxing/zxing-j2se-1.7.jar包, 包含类 com.google.zxing.StringsResourceTranslator.class com.google.zxing.client.j2se.BufferedImageLuminanceSource.class ...

    学习j2se的30个问题

    - **接口**:定义了一组行为的契约,没有具体的实现细节。 7. **静态绑定与动态绑定**: - **静态绑定**:在编译时确定方法调用的目标。 - **动态绑定**:运行时根据对象的实际类型来决定方法调用,实现了多态性...

Global site tag (gtag.js) - Google Analytics