You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

179 lines
6.0 KiB

4 months ago
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.List;
4 months ago
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);
}
4 months ago
/**
*
*/
public static void main(String[] args) {
4 months ago
EventQueue.invokeLater(() -> {
new BaseConverterGUI();
});
}
// GUI 类
public static class BaseConverterGUI extends JFrame {
private JTextField inputField;
private JComboBox<Integer> sourceBaseBox;
private JComboBox<Integer> targetBaseBox;
4 months ago
private JButton convertButton;
private JLabel resultLabel;
4 months ago
public BaseConverterGUI() {
setTitle("进制转换器");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 居中显示
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
4 months ago
// 输入框
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;
4 months ago
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<Integer> 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);
4 months ago
// 转换按钮
gbc.gridx = 1;
gbc.gridy = 3;
gbc.fill = GridBagConstraints.NONE;
gbc.weightx = 0;
gbc.anchor = GridBagConstraints.CENTER;
4 months ago
convertButton = new JButton("转换");
add(convertButton, gbc);
4 months ago
// 结果标签
gbc.gridx = 0;
gbc.gridy = 4;
gbc.gridwidth = 2;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1;
gbc.anchor = GridBagConstraints.LINE_START;
4 months ago
resultLabel = new JLabel("转换结果:");
add(resultLabel, gbc);
4 months ago
// 添加监听器到按钮
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();
4 months ago
String result = convertBase(input, sourceBase, targetBase);
resultLabel.setText("转换结果:" + result);
} catch (Exception ex) {
JOptionPane.showMessageDialog(BaseConverterGUI.this, "输入错误,请检查后重试!", "错误", JOptionPane.ERROR_MESSAGE);
}
}
});
pack(); // 自动调整大小以适应所有组件
4 months ago
setVisible(true);
}
}
4 months ago
}