import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Arrays; import java.util.List; public class BaseConverter { private static final char[] DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; /** * 将给定进制的字符串转换为十进制整数 * * @param str 给定进制的字符串表示 * @param base 给定进制的基数 * @return 十进制整数 */ public static int toDecimal(String str, int base) { int result = 0; int power = 0; for (int i = str.length() - 1; i >= 0; i--) { char c = str.charAt(i); int digit = Character.isDigit(c) ? c - '0' : c - 'A' + 10; result += digit * Math.pow(base, power++); } return result; } /** * 将十进制整数转换为目标进制的字符串 * * @param decimal 十进制整数 * @param targetBase 目标进制的基数 * @return 目标进制的字符串表示 */ public static String fromDecimal(int decimal, int targetBase) { if (decimal == 0) { return "0"; } StringBuilder result = new StringBuilder(); while (decimal > 0) { result.insert(0, DIGITS[decimal % targetBase]); decimal /= targetBase; } return result.toString(); } /** * 将任意进制的数转换为另一个任意进制的数 * * @param str 给定进制的字符串表示 * @param sourceBase 给定进制的基数 * @param targetBase 目标进制的基数 * @return 目标进制的字符串表示 */ public static String convertBase(String str, int sourceBase, int targetBase) { int decimalValue = toDecimal(str, sourceBase); return fromDecimal(decimalValue, targetBase); } /** * 主方法,用于测试 */ public static void main(String[] args) { EventQueue.invokeLater(() -> { new BaseConverterGUI(); }); } // GUI 类 public static class BaseConverterGUI extends JFrame { private JTextField inputField; private JComboBox sourceBaseBox; private JComboBox targetBaseBox; private JButton convertButton; private JLabel resultLabel; public BaseConverterGUI() { setTitle("进制转换器"); setSize(400, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); // 居中显示 setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); // 输入框 gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.EAST; gbc.insets = new Insets(5, 5, 5, 5); add(new JLabel("输入数据(例如 A1):"), gbc); gbc.gridx = 1; gbc.gridy = 0; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.anchor = GridBagConstraints.WEST; inputField = new JTextField(); add(inputField, gbc); // 源进制下拉菜单 gbc.gridx = 0; gbc.gridy = 1; gbc.fill = GridBagConstraints.NONE; gbc.weightx = 0; gbc.anchor = GridBagConstraints.EAST; add(new JLabel("源进制数(例如 16):"), gbc); gbc.gridx = 1; gbc.gridy = 1; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.anchor = GridBagConstraints.WEST; List bases = Arrays.asList(2, 4, 8, 10, 16, 32); sourceBaseBox = new JComboBox<>(bases.toArray(new Integer[0])); add(sourceBaseBox, gbc); // 目标进制下拉菜单 gbc.gridx = 0; gbc.gridy = 2; gbc.fill = GridBagConstraints.NONE; gbc.weightx = 0; gbc.anchor = GridBagConstraints.EAST; add(new JLabel("目标进制数(例如 2):"), gbc); gbc.gridx = 1; gbc.gridy = 2; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.anchor = GridBagConstraints.WEST; targetBaseBox = new JComboBox<>(bases.toArray(new Integer[0])); add(targetBaseBox, gbc); // 转换按钮 gbc.gridx = 1; gbc.gridy = 3; gbc.fill = GridBagConstraints.NONE; gbc.weightx = 0; gbc.anchor = GridBagConstraints.CENTER; convertButton = new JButton("转换"); add(convertButton, gbc); // 结果标签 gbc.gridx = 0; gbc.gridy = 4; gbc.gridwidth = 2; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1; gbc.anchor = GridBagConstraints.LINE_START; resultLabel = new JLabel("转换结果:"); add(resultLabel, gbc); // 添加监听器到按钮 convertButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { String input = inputField.getText().toUpperCase(); int sourceBase = (Integer) sourceBaseBox.getSelectedItem(); int targetBase = (Integer) targetBaseBox.getSelectedItem(); String result = convertBase(input, sourceBase, targetBase); resultLabel.setText("转换结果:" + result); } catch (Exception ex) { JOptionPane.showMessageDialog(BaseConverterGUI.this, "输入错误,请检查后重试!", "错误", JOptionPane.ERROR_MESSAGE); } } }); pack(); // 自动调整大小以适应所有组件 setVisible(true); } } }