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类 相关的知识,以下是实现的具体思路:

  1. 导入相关的java包。
    原则上,实现的代码是只能写在/begin/和/end/之间的,但是import包没法写在类内部,只能在题目要求的区域外导入!
  2. 声明MyWindow类。
    即使如此,还是应该尽可能将代码写在题目要求的区域内,这意味着你不能让Prog3继承JFrame或者在Prog3外面实现一个MyWindow类,所以MyWindow类必须是内部类!
    在静态方法main中创建MyWindow类的实例,因为main方法为静态方法,所以MyWindow类要声明为静态类(我考试的时候在这卡住了)。
    另外,因为按下按钮涉及到事件处理,MyWindow类要实现 ActionListener 接口。
    最终MyWindow类的声明代码如下:“static class MyWindow extends JFrame implements ActionListener {}”
  3. 在MyWindow类中定义属性 jp1,jp2,jtf1,jtf2,jb1。
  4. 在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);
  5. 重写actionPerformed方法,实现进制转换。
    Java中内置了十进制转十六进制的函数,但我实现的思路主要还是自己转换。
    这时,你首先感到的困难可能是Java使用的是Unicode编码,而不是ASCII(我在考场上就感觉坏事了),但实际上这根本不是问题,因为无论哪种编码中字符'A'到'Z',字符'0'到'9'都是连续的。
    比较麻烦的是你要把jtf1.getText()得到的字符串转换成数字,一种方法是用for循环遍历字符串累加(这样反而方便些),另一种办法是使用Java中内置的相关函数:“int num = Integer.parseInt(text);”。
最后修改:2024 年 04 月 27 日
如果觉得我的文章对你有用,请随意赞赏