首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Swing 進制轉換工具:修正 JTextField 變數重複導致八進制/十六進制欄位異常

     編輯:程式設計綜合問答

錯誤現象

程式執行後輸入十進制數值,二進制欄位正常顯示,但八進制與十六進制欄位皆顯示十六進制值,且十六進制欄位初始值錯誤。

根本原因

建立元件時,jt3 被重複指派:

// 錯誤程式碼片段
add(new JLabel("八進制"));
jt3 = new JTextField("1777");
jt3.setEditable(false);
add(jt3);

add(new JLabel("十六進制"));
jt3 = new JTextField("3ff"); // 這裡應為 jt4
jt4.setEditable(false);      // jt4 尚未初始化,拋出 NPE
add(jt4);

導致「八進制」標籤對應的實際是十六進制輸入框,且 jt4 未實例化就呼叫 setEditable。

修正程式碼

add(new JLabel("八進制"));
jt3 = new JTextField("1777");
jt3.setEditable(false);
add(jt3);

add(new JLabel("十六進制"));
jt4 = new JTextField("3ff"); // 修正:使用 jt4
jt4.setEditable(false);
add(jt4);

完整可運行範例

package 進制轉換;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JinZhi extends JFrame implements ActionListener {
    JTextField jt1, jt2, jt3, jt4;

    public JinZhi() {
        super("十進制轉換");
        setBounds(200, 100, 300, 200);
        setLayout(new GridLayout(4, 2));
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        add(new JLabel("十進制"));
        jt1 = new JTextField("1023");
        jt1.addActionListener(this);
        add(jt1);

        add(new JLabel("二進制"));
        jt2 = new JTextField("1111111111");
        jt2.setEditable(false);
        add(jt2);

        add(new JLabel("八進制"));
        jt3 = new JTextField("1777");
        jt3.setEditable(false);
        add(jt3);

        add(new JLabel("十六進制"));
        jt4 = new JTextField("3FF");
        jt4.setEditable(false);
        add(jt4);

        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        try {
            int val = Integer.parseInt(jt1.getText().trim());
            jt2.setText(Integer.toBinaryString(val));
            jt3.setText(Integer.toOctalString(val));
            jt4.setText(Integer.toHexString(val).toUpperCase());
        } catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(this, "請輸入有效整數");
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(JinZhi::new);
    }
}

補充建議

  • 使用 SwingUtilities.invokeLater 在 EDT 建立 GUI,符合執行緒安全規範。
  • 加入 try-catch 處理非數字輸入,提升使用者體驗。
  • 十六進制輸出建議 .toUpperCase() 統一大寫,易讀性較佳。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved