Java期末考试最后一个题考到用Java Swing实现一个十进制转十六进制的进制转换器,由于对Java不熟,写这道题遇到诸多困难,考场上一个小时都没写出来。
于是考完试专门实现了一下,并写此博客,分析对Java不熟的情况下做这道题会遇到的困难。
题目:
用Java实现一个十进制转十六进制的进制转换器,至少要有三个组件,在两行中显示:
第一行,一个 JTextField 组件用于输入文本,一个 JButton 组件用于按下按钮,执行进制转换操作
第二行,一个不可编辑的 JTextField 组件用于显示进制转换的结果
模板:
public class Prog3 {
/*****begin*****/
/******end******/
}
一种可能的实现:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Prog3 {
/*****begin*****/
public static void main(String[] args) {
MyWindow w = new MyWindow();
}
static class MyWindow extends JFrame implements ActionListener {
private JTextField jtf1,jtf2;
private JButton jb1;
private JPanel jp1, jp2;
public MyWindow() {
jp1 = new JPanel();
jtf1 = new JTextField(10);
jb1 = new JButton();
jp1.add(jtf1);
jp1.add(jb1);
jb1.addActionListener(this);
this.add(jp1, BorderLayout.CENTER);
jp2 = new JPanel();
jtf2 = new JTextField(10);
jtf2.setEditable(false);
jp2.add(jtf2);
this.add(jp2, BorderLayout.SOUTH);
this.setTitle("Prog3");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBounds(100, 100, 200, 150);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
//System.out.println("按钮被点击");
String text = jtf1.getText();
int num = Integer.parseInt(text);
String hexString = "";
while(num > 0) {
int n = num % 16;
num = num / 16;
char digit;
if(n<10) {
digit = (char)('0'+n);
} else {
digit = (char)('A'+n-10);
}
hexString = digit + hexString;
}
jtf2.setText(hexString);
}
}
/******end******/
}
分析:
本题目需要用到 Swing图形编程,事件处理,内部类,String类 相关的知识,以下是实现的具体思路:
- 导入相关的java包。
原则上,实现的代码是只能写在/begin/和/end/之间的,但是import包没法写在类内部,只能在题目要求的区域外导入! - 声明MyWindow类。
即使如此,还是应该尽可能将代码写在题目要求的区域内,这意味着你不能让Prog3继承JFrame或者在Prog3外面实现一个MyWindow类,所以MyWindow类必须是内部类!
在静态方法main中创建MyWindow类的实例,因为main方法为静态方法,所以MyWindow类要声明为静态类(我考试的时候在这卡住了)。
另外,因为按下按钮涉及到事件处理,MyWindow类要实现 ActionListener 接口。
最终MyWindow类的声明代码如下:“static class MyWindow extends JFrame implements ActionListener {}” - 在MyWindow类中定义属性 jp1,jp2,jtf1,jtf2,jb1。
在MyWindow类的构造函数中设置界面布局。
需要注意:
① JTextField 实例化代码“jtf1 = new JRextField(10);”要提供参数10,否则默认的文本框很窄,几乎看不到。
② 将JPanel加入到JFrame的代码“this.add(jp1, BorderLayout.CENTER);”需要提供第二个参数设置JPanel的位置。
③ 如下代码要放在构造函数的最后,而不是开头,否则默认显示不出组件this.setTitle("Prog3"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setBounds(100, 100, 200, 150); this.setVisible(true);
- 重写actionPerformed方法,实现进制转换。
Java中内置了十进制转十六进制的函数,但我实现的思路主要还是自己转换。
这时,你首先感到的困难可能是Java使用的是Unicode编码,而不是ASCII(我在考场上就感觉坏事了),但实际上这根本不是问题,因为无论哪种编码中字符'A'到'Z',字符'0'到'9'都是连续的。
比较麻烦的是你要把jtf1.getText()得到的字符串转换成数字,一种方法是用for循环遍历字符串累加(这样反而方便些),另一种办法是使用Java中内置的相关函数:“int num = Integer.parseInt(text);”。