程式執行後輸入十進制數值,二進制欄位正常顯示,但八進制與十六進制欄位皆顯示十六進制值,且十六進制欄位初始值錯誤。
建立元件時,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() 統一大寫,易讀性較佳。