Из эта ссылка :
Если извлечение завершилось неудачно (например, если была введена буква, где цифра ожидается), значение остается неизмененным и устанавливается битбит ( до C ++ 11)
Если извлечение завершилось неудачно, нуль записывается в значение и устанавливается failbit. Если извлечения приводит к слишком большому или слишком маленькому значению, чтобы соответствовать значению, записывается std :: numeric_limits :: max () или std :: numeric_limits :: min () и устанавливается флаг failbit. (поскольку C ++ 11)
blockquote>Кажется, что ваш компилятор компилируется в режиме C ++ 11, что изменяет поведение.
Оператор ввода использует фасет локали
std::num_get
, функцияget
вызываетdo_get
. Для C ++ 11 указано использованиеstd::strtoll
et. и др. тип функций. До C ++ 11 он, по-видимому, использовалstd::scanf
разбор стиля (по ссылке, у меня нет доступа к спецификации C ++ 03) для извлечения чисел. Изменение поведения связано с этим изменением в анализе ввода.
Когда event.getSource() == bin
истинно, ни один из вложенных операторов if не может быть истинным: if(event.getSource() == n1){
Также этот if всегда будет истинным, поскольку оператор присваивания pass = 1; if(pass == 1){
Попробуйте перекрасить или повторно проверить после обновления:
textField.repaint();
Или, возможно:
textField.revalidate();
Проверить: https://docs.oracle.com/javase/tutorial /uiswing/painting/problems.html
Итак, вам нужна отдельная переменная для хранения текущего типа представления (двоичное / восьмеричное / десятичное / шестнадцатеричное)
В вашем коде оно должно выглядеть следующим образом:
private static final int BINARY = 2; // probably use enum
private static final int OCTAL = 8; // probably use enum
private static final int DECIMAL = 10; // probably use enum
private JTextField textField;
private JButton n1, n2, n3, n4, n5, n6, n7, n8, n9, n0, add, subtract, multiply, divide, clear, backspace, bin, dec, oct, hex;
private JPanel panel, panel1, p;
private int system = DECIMAL;
// initialization code
public void actionPerformed(ActionEvent event)
{
if(event.getSource() == bin){
system = BINARY;
} else if (event.getSource() == dec) {
system = DECIMAL;
} // same for other systems.
if (system == BINARY) {
if(event.getSource() == n1){
textField.setText(textField.getText() + "1");
}
else if(event.getSource() == n0){
textField.setText(textField.getText() + "0");
}
else if(event.getSource() == add){
textField.setText(textField.getText() + " + ");
}
else if(event.getSource() == subtract){
textField.setText(textField.getText() + " - ");
}
else if(event.getSource() == multiply){
textField.setText(textField.getText() + " * ");
}
else if(event.getSource() == divide){
textField.setText(textField.getText() + " / ");
}
else if(event.getSource() == clear){
textField.setText("");
}
} else if (system == DECIMAL) {
if(event.getSource() == n1){
textField.setText(textField.getText() + "1");
}
else if(event.getSource() == n2){
textField.setText(textField.getText() + "2");
}
else if(event.getSource() == n3){
textField.setText(textField.getText() + "3");
}
else if(event.getSource() == n4){
textField.setText(textField.getText() + "4");
}
else if(event.getSource() == n5){
textField.setText(textField.getText() + "5");
}
else if(event.getSource() == n6){
textField.setText(textField.getText() + "6");
}
else if(event.getSource() == n7){
textField.setText(textField.getText() + "7");
}
else if(event.getSource() == n8){
textField.setText(textField.getText() + "8");
}
else if(event.getSource() == n9){
textField.setText(textField.getText() + "9");
}
else if(event.getSource() == n0){
textField.setText(textField.getText() + "0");
}
else if(event.getSource() == add){
textField.setText(textField.getText() + " + ");
}
else if(event.getSource() == subtract){
textField.setText(textField.getText() + " - ");
}
else if(event.getSource() == multiply){
textField.setText(textField.getText() + " * ");
}
else if(event.getSource() == divide){
textField.setText(textField.getText() + " / ");
}
else if(event.getSource() == clear){
textField.setText("");
}
} // same for other systems
}
Обратите внимание : лучше предоставить отдельный обработчик для любой кнопки. Например, вы можете сделать это, используя лямбды. В этом случае вам не нужны огромные блоки if-else-if