您的位置 首页 java

使用Swing制作进制转化器

使用Swing制作进制转化器

1. 各进制之间的转化

在计算机科学中,常用的进制有二进制、 八进制 、十进制和十六进制。在开发过程中使用比较多的是二进制和十进制的。如果涉及一些字节编码操作,十六进制也会用得到,甚至可能会用到三十二进制。

1.1 十进制向其它进制转化

以正常的十进制数为标准,如果将一个十进制数转化成二进制数。可以使用除法取余的方式进行,在下图中我们用二进制和八进制进行举例:

使用Swing制作进制转化器

十进制转化成二进制、八进制

上图所描述的是一个正整数转化成各进制的算法描述。如果被转化数是负数,需要经过三步转化:1.先计算出其正整数的二进制码。2.再计算其反码。3.再计算补码。以-5为例子,计算的二进制如下图所示:

使用Swing制作进制转化器

-5的二进制码

在不同的计算机语言中,负数的二进制码不一定相同,因为这取决于各种数据所占有的内存长度(字节数)。例如在 Java 中,int占据4个字节(32位),而long类型占据的是8个字节(64位),它们在计算-5时的二进制数是不同的。

如果我们无法确定数据所占据的内存大小,也就无法准确的描述出负数的各进制数值,只能以正数的进制表示,然后增加一个负号。这也是Java中,大整型BigInteger处理的方式。

1.2 其它进制向十进制转化

其它进制向十进制转化,可以通过按权展开求和的方式进行。假设数值A为N进制数,则其十进制值D的值公式如下:

AmaxBit*Nbit-1 +Amaxbit-1*Nbit-2 + …… + A1N0

其中maxbit为A的最高位数值(A1表示个位数值,Amaxbit表示最高位数值),bit为A的总位数。如果二进制11001和十六进制FFEE转化成十进制,按照上述公式展开如下:

· 11001的十进制:1*24+1*23+0*22+0*21+1*0=16+8+0+0+1=25

· FFEE的十进制:15*163+15*162+14*161+140=61440+3840+224+14=65518

其它进制向十进制进行转化也是按照这个展开公式进行。

2. 使用 Swing 图形化

我们的主要目的是将进制的转化用图形化的方式进行处理,通过 GUI 界面的形式展现出来。需要我们完成的主要工作如下:

1. 由用户输入各种进制的数值,输入的进制可以调节,但需要控制输入的总长度。

2. 输出通用的四种进制(二、八、十、十六进制),可以自定义一种输出进制。

3. 进制转化的显示是实时的。

此外,由于手动输入数值,可能会超过Java基础数据的限制,无法确定位数。在转化负数的时候无法通过补码来完成,我们的核心转化工作可以由BigInteger来实现。

在设计GUI界面的时候,我们需要设计四个部分的组件群:

1. 输入进制控制组件:可使用的组件有JSlider(滑杆)和JComboBox(下拉列表)。进制的转化范围可以从二进制到三十六进制,在图形化中我们可以用滑杆JSlider来处理。JSlider的可以设置成最小值为2,最大值为36,默认值为10。移动单位为1。另外可以并通过一个JLabel组件实时跟踪滑杆数据变化状态。

2. 输出进制控制组件:同上。

3. 输入组件:输入组件可以使用JTextField,在输入内容的时候,需要对文本进行监控,不能输入超出转化范围的字符。例如三十六进制只能输入1~9和a到z范围内的字符。文本控制可以通过Document监听器进行控制。

4. 转化后的输出组件:转化后的输出组件由五个JLabel构成,分别对应二进制、八进制、十进制、十六进制以及自定义进制。

2.1 GUI组件搭建

除了必要操作组件和显示组件外了,还可以添加一些额外的组件用于界面的装饰和说明。界面搭建如下图所示(供参考):

使用Swing制作进制转化器

搭建界面

2.2 功能分析

由我们手动操作的组件有三个,需要进行一些变量的设置操作,主要的变量如下:

1、int inHex:输入进制的整型表示数,默认为10。

2、int outHex:输出进制的整型表示数,默认为10。

3、String regex:用于过滤文本框中字符内容的正则表达式。默认为”[0-9]+”。

1.输入进制滑杆(JSlider in):设置正确的属性以及显示位置。该组件还应该添加变动监听(ChangeListener)。在监听中应保持inHex和滑杆in的值一致。此外还应该更新正则表达式regex的内容。并处理左侧标签JLabel中的内容(界面图形中,滑杆左侧的JLabel标签内容)。

2.输出进制滑杆(JSlider out):同上。不同之处在于,监听中应保持outHex和滑杆out的值是一致的。当输出滑杆调节后,还需要更新左侧标签JLabel中的内容。

3.输入文本框(JTextField input):设置正确的属性以及显示位置。该组件应该对其Document对象进行文档监听(DocumentListener),处理insertUpdate监听内容,监听的内容有两部分:

· 当添加后的文本内容不符合regex的验证时,删除新增的内容,保持原有文本内容(需要额外注意一点,DocumentListener中在当前 线程 中使用Document处理文档时会出现异常,需要使用EDT线程进行处理)。

· 当文本内容符合正则表达式验证要求时,将文本框内的信息进行进制转化处理,并将转化的结果在对应的JLabel标签中输出。

2.3 程序实现源码

程序源码下载地址:

运行及使用效果图如下:

使用Swing制作进制转化器

效果1(输入、输出均为10进制)

使用Swing制作进制转化器

效果2(输入10进制、输出均为15进制)

使用Swing制作进制转化器

效果3(输入5进制、输出均为16进制)

上述示例中,我们只进行了最简单的功能实现,目前无法输入负数并进行转化。如果需要增加负数转换等相关功能,可以在此基础上进行改造。

这个项目的目的是练习Swing组件,以及EDT线程和工作线程的使用。

文章来源:智云一二三科技

文章标题:使用Swing制作进制转化器

文章地址:https://www.zhihuclub.com/184310.shtml

关于作者: 智云科技

热门文章

网站地图