📄 radixconvertor.java
字号:
package com.zcsoft.jpsc.gui;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
/**
* <p>Title: 串口通信</p>
* <p>Description: 串口通信实验</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: Zhicheng Software&Service Co. Ltd.</p>
* @author 蒋智湘
* @version 1.0
*/
/** 字符、二进制、十进制或十六进制值相互转换显示类 */
public class RadixConvertor extends JPanel implements ActionListener
{
private static ResourceBundle res = JpscToolkit.getStringResourceBundle();
/** 进制 */
private static final int[] radixes = new int[]{Character.MIN_RADIX - 1, 10, 16, 2};
/** 进制类型描述 */
private final String[] radixName
= new String[]{res.getString("convertor.radix.character"),
res.getString("convertor.radix.decimal"),
res.getString("convertor.radix.hex"),
res.getString("convertor.radix.binary")};
/** 输入进制类型的文本输入框 */
private JTextField[] radixValueField = new JTextField[radixes.length];
/** 控制字符之文字描述索引表 */
private static Map controlSet = new Hashtable();
/** 分隔符 */
private JTextField txtDelimiter = new JTextField(" ", 5);
static
{
storeConstrolSet();
}
public RadixConvertor()
{
super(new GridBagLayout());
jbInit();
}
/** 构建界面 */
private void jbInit()
{
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.WEST;
gbc.gridy = 1;
gbc.gridx = 1;
this.add(new JLabel(res.getString("convertor.delimiter")), gbc);
gbc.gridx ++;
this.add(this.txtDelimiter, gbc);
for (int i = 0; i < radixValueField.length; i++)
{
gbc.gridy ++;
gbc.fill = GridBagConstraints.NONE;
gbc.gridx = 1;
gbc.weightx = 0;
this.add(new JLabel(radixName[i]), gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx ++;
gbc.weightx = 1;
this.add(radixValueField[i] = new JTextField(10), gbc);
radixValueField[i].addActionListener(this);
}
}
/** 进制值输入框上回车事件实现 */
public void actionPerformed(ActionEvent e)
{
String strValue = ((JTextField)e.getSource()).getText();
if(strValue.length() == 0)
{
return;
}
int fieldIndex = indexOfRadixField(e.getSource());
if (fieldIndex == -1)
{
return;
}
int radix = radixes[fieldIndex];
for (int i = 0; i < radixes.length; i++)
{
try
{
if (i == fieldIndex)
{
continue;
}
int toRadix = radixes[i];
StringBuffer convertedStrBuffer = new StringBuffer();
String delim = this.txtDelimiter.getText();
if (strValue.length() > 1)
{
StringTokenizer st = new StringTokenizer(strValue, String.valueOf(delim));
while(st.hasMoreTokens())
{
convertOneToken(convertedStrBuffer, st.nextToken(), delim, radix, toRadix);
}
}
else
{
convertOneToken(convertedStrBuffer, strValue, delim, radix, toRadix);
}
this.radixValueField[i].setText(convertedStrBuffer.substring(0, convertedStrBuffer.length() - delim.length()));
}
catch (NumberFormatException ex)
{
((JTextField)e.getSource()).selectAll();
return;
}
}
}
private void convertOneToken(StringBuffer storeBuffer, String token
, String delim
, int radixFrom, int toRadix)
throws NumberFormatException
{
int intValue;
if (isCharFormat(radixFrom))
{
Character controlCode;
if(token.length() > 1
&& token.charAt(0) == '\\'
&& token.charAt(1) != '\\'
&& (controlCode = findASCIIByControlName(token)) != null)
{
intValue = controlCode.charValue();
}
else
{
for (int i = 0; i < token.length(); i++)
{
storeBuffer.append(toString(token.charAt(i), toRadix));
storeBuffer.append(delim);
}
return;
}
}
else
{
intValue = Integer.parseInt(token, radixFrom);
}
storeBuffer.append(toString(intValue, toRadix));
storeBuffer.append(delim);
}
/**
* 根据控制字符的名称查找对应的ASCII码值
* @param controlCodeName
* @return 如果没有找到,则返回null
* @see #controlSet
*/
private Character findASCIIByControlName(String controlCodeName)
{
Iterator elements = controlSet.entrySet().iterator();
while (elements.hasNext())
{
Map.Entry entry = (Map.Entry)elements.next();
if (controlCodeName.equals(entry.getValue()))
{
return (Character)entry.getKey();
}
}
return null;
}
/**
* 某个指定ASCII码在某个指定的进制下的字符串表示
* @param ASCII
* @param radix 1/2/10/16进制。1代表字符串
* @return 对于控制字符,则从controlSet中找到并返回它对应的名称,如果找不到,则返回null。
*
*/
private String toString(int ASCII, int radix)
{
String strValue;
if (isCharFormat(radix))
{
char charValue = (char)ASCII;
if (Character.isISOControl(charValue))
{
strValue = (String)controlSet.get(new Character(charValue));
}
else
{
strValue = String.valueOf(charValue);
}
}
else
{
strValue = Integer.toString(ASCII, radix);
}
return strValue;
}
private static boolean isCharFormat(int radix)
{
return radix < Character.MIN_RADIX;
}
/**
* 查找触发回车事件的进制输入框的索引。程序可依据该索引值找到对应的进制
* @param eventSource 触发回车事件的组件
* @return eventSource在radixValueField数组上的索引。如果没有,则返回-1。
*/
private int indexOfRadixField(Object eventSource)
{
int index = -1;
for (int i = 0; i < radixValueField.length; i++)
{
if (radixValueField[i] == eventSource)
{
index = i;
break;
}
}
return index;
}
/** 记录控制字符映射表 */
private static void storeConstrolSet()
{
controlSet.put(new Character((char)0), res.getString("controlKey.0"));
controlSet.put(new Character((char)1), res.getString("controlKey.1"));
controlSet.put(new Character((char)2), res.getString("controlKey.2"));
controlSet.put(new Character((char)3), res.getString("controlKey.3"));
controlSet.put(new Character((char)4), res.getString("controlKey.4"));
controlSet.put(new Character((char)5), res.getString("controlKey.5"));
controlSet.put(new Character((char)6), res.getString("controlKey.6"));
controlSet.put(new Character((char)7), res.getString("controlKey.7"));
controlSet.put(new Character('\b'), res.getString("controlKey.8"));
controlSet.put(new Character('\t'), res.getString("controlKey.9"));
controlSet.put(new Character('\n'), res.getString("controlKey.10"));
controlSet.put(new Character((char)0xB), res.getString("controlKey.11"));
controlSet.put(new Character('\f'), res.getString("controlKey.12"));
controlSet.put(new Character('\r'), res.getString("controlKey.13"));
controlSet.put(new Character((char)0xE), res.getString("controlKey.14"));
controlSet.put(new Character((char)0xF), res.getString("controlKey.15"));
controlSet.put(new Character((char)0x10), res.getString("controlKey.16"));
controlSet.put(new Character((char)0x11), res.getString("controlKey.17"));
controlSet.put(new Character((char)0x12), res.getString("controlKey.18"));
controlSet.put(new Character((char)0x13), res.getString("controlKey.19"));
controlSet.put(new Character((char)0x14), res.getString("controlKey.20"));
controlSet.put(new Character((char)0x15), res.getString("controlKey.21"));
controlSet.put(new Character((char)0x16), res.getString("controlKey.22"));
controlSet.put(new Character((char)0x17), res.getString("controlKey.23"));
controlSet.put(new Character((char)0x18), res.getString("controlKey.24"));
controlSet.put(new Character((char)0x19), res.getString("controlKey.25"));
controlSet.put(new Character((char)0x1A), res.getString("controlKey.26"));
controlSet.put(new Character((char)0x1B), res.getString("controlKey.27"));
controlSet.put(new Character((char)0x1C), res.getString("controlKey.28"));
controlSet.put(new Character((char)0x1D), res.getString("controlKey.29"));
controlSet.put(new Character((char)0x1E), res.getString("controlKey.30"));
controlSet.put(new Character((char)0x1F), res.getString("controlKey.31"));
/*
00 NUL 空字符
01 SOH 标题起始 (Ctrl/A)
02 STX 文本起始 (Ctrl/B)
03 ETX 文本结束 (Ctrl/C)
04 EOT 传输结束 (Ctrl/D)
05 ENQ 询问 (Ctrl/E)
06 ACK 认可 (Ctrl/F)
07 BEL 铃 (Ctrl/G)
08 BS 退格 (Ctrl/H)
09 HT 水平制表栏 (Ctrl/I)
0A LF 换行 (Ctrl/J)
0B VT 垂直制表栏 (Ctrl/K)
0C FF 换页 (Ctrl/L)
0D CR 回车 (Ctrl/M)
0E SO 移出 (Ctrl/N)
0F SI 移入 (Ctrl/O)
10 DLE 数据链接丢失 (Ctrl/P)
11 DC1 设备控制 1 (Ctrl/Q)
12 DC2 设备控制 2 (Ctrl/R)
13 DC3 设备控制 3 (Ctrl/S)
14 DC4 设备控制 4 (Ctrl/T)
15 NAK 否定接受 (Ctrl/U)
16 SYN 同步闲置符 (Ctrl/V)
17 ETB 传输块结束 (Ctrl/W)
18 CAN 取消 (Ctrl/X)
19 EM 媒体结束 (Ctrl/Y)
1A SUB 替换 (Ctrl/Z)
1B ESC 换码符
1C FS 文件分隔符
1D GS 组分隔符
1E RS 记录分隔符
1F US 单位分隔符
*/
}
//
// public static void main(String[] args)
// {
// JFrame f = new JFrame();
// f.getContentPane().add(new RadixConvertor());
// f.pack();
// f.show();
// }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -