Тема: Коментарі до програми калькулятора
Доброго дня,
створив програму калькулятор. Так як це друга моя програма в житті, прошу більш досвідчених подивитись на код і дати кілька (або багато ))) своїх коментарів щодо нього. Підозрюю що код дещо незграбний, але з чогось треба починати.
Ось код
package mynewcalc;
import javafx.application.*;
import javafx.event.ActionEvent;
import javafx.scene.*;
import javafx.scene.text.Font;
import javafx.stage.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.geometry.*;
import javafx.scene.input.KeyCode;
public class MyNewCalc extends Application {
Button btnPlus;
Button btnMinus;
Button btnDiv;
Button btnMult;
Button btnEquv;
Button btnC;
Button btnMemPlus;
Button btnMemMin;
Button btnMemR;
Button btnMemC;
Button btnComma;
Button btnBSpace;
Button btnSqRoot;
Button btnPlusMin;
Button btn1;
Button btn2;
Button btn3;
Button btn4;
Button btn5;
Button btn6;
Button btn7;
Button btn8;
Button btn9;
Button btn0;
Button btnPerc;
Label tf = LabelBuilder.create()
.text("0")
.prefWidth(190)
.prefHeight(50)
.alignment(Pos.BOTTOM_RIGHT)
.build();
Label mem;
static String str = "0";
static Double num1 = 0.0;
static Double num2 = 0.0;
static char oper = ' ';
static boolean newNum = true;
static Double numMem = null;
static boolean eqvFlag = false;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage myStage) {
myStage.setTitle("Mulyak Calc");
FlowPane rootNode = new FlowPane(Orientation.VERTICAL, 10, 10);
myStage.setResizable(false);
Scene myScene = new Scene(rootNode, 210, 290);
GridPane numPane = new GridPane();
GridPane scrPane = new GridPane();
rootNode.setAlignment(Pos.TOP_CENTER);
numPane.setAlignment(Pos.BOTTOM_CENTER);
numPane.setHgap(3);
numPane.setVgap(3);
myStage.setScene(myScene);
btnPlus = new Button("+");
btnMinus = new Button("-");
btnDiv = new Button("/");
btnMult = new Button("*");
btnEquv = new Button("=");
btnC = new Button("C");
btnMemPlus = new Button("M+");
btnMemMin = new Button("M-");
btnMemR = new Button("MR");
btnMemC = new Button("MC");
btnComma = new Button(",");
btnBSpace = new Button("<-");
btnSqRoot = new Button("Sq Root");
btnPlusMin = new Button("+-");
btn1 = new Button("1");
btn2 = new Button("2");
btn3 = new Button("3");
btn4 = new Button("4");
btn5 = new Button("5");
btn6 = new Button("6");
btn7 = new Button("7");
btn8 = new Button("8");
btn9 = new Button("9");
btn0 = new Button("0");
btnPerc = new Button("%");
mem = new Label ();
scrPane.setPadding(new Insets(10, 10, 10, 10));
tf.setStyle("-fx-background-color: lightblue; -fx-border-color: black;");
btnSqRoot.setWrapText(true);
btnSqRoot.setFont(new Font("Arial", 8));
btnPlus.setPrefSize(35.0, 30.0);
btnMinus.setPrefSize(35.0, 30.0);
btnDiv.setPrefSize(35.0, 30.0);
btnMult.setPrefSize(35.0, 30.0);
btnEquv.setPrefSize(35.0, 30.0);
btnC.setPrefSize(35.0, 30.0);
btnMemPlus.setPrefSize(35.0, 30.0);
btnMemMin.setPrefSize(35.0, 30.0);
btnMemR.setPrefSize(35.0, 30.0);
btnMemC.setPrefSize(35.0, 30.0);
btnComma.setPrefSize(35.0, 30.0);
btnBSpace.setPrefSize(35.0, 30.0);
btnSqRoot.setPrefSize(35.0, 30.0);
btnPlusMin.setPrefSize(35.0, 30.0);
btn1.setPrefSize(35.0, 30.0);
btn2.setPrefSize(35.0, 30.0);
btn3.setPrefSize(35.0, 30.0);
btn4.setPrefSize(35.0, 30.0);
btn5.setPrefSize(35.0, 30.0);
btn6.setPrefSize(35.0, 30.0);
btn7.setPrefSize(35.0, 30.0);
btn8.setPrefSize(35.0, 30.0);
btn9.setPrefSize(35.0, 30.0);
btn0.setPrefSize(35.0, 30.0);
btnPerc.setPrefSize(35.0, 30.0);
tf.setPrefSize(190.0, 50.0);
GridPane.setConstraints(btnPlus, 2, 5);
GridPane.setConstraints(btnMinus, 3, 4);
GridPane.setConstraints(btnDiv, 3, 2);
GridPane.setConstraints(btnMult, 3, 3);
GridPane.setConstraints(btnEquv, 3, 5);
GridPane.setConstraints(btnC, 4, 2);
GridPane.setConstraints(btnMemPlus, 3, 1);
GridPane.setConstraints(btnMemMin, 2, 1);
GridPane.setConstraints(btnMemR, 1, 1);
GridPane.setConstraints(btnMemC, 0, 1);
GridPane.setConstraints(btnComma, 1, 5);
GridPane.setConstraints(btnBSpace, 4, 1);
GridPane.setConstraints(btnSqRoot, 4, 5);
GridPane.setConstraints(btnPlusMin, 4, 4);
GridPane.setConstraints(btn1, 0, 4);
GridPane.setConstraints(btn2, 1, 4);
GridPane.setConstraints(btn3, 2, 4);
GridPane.setConstraints(btn4, 0, 3);
GridPane.setConstraints(btn5, 1, 3);
GridPane.setConstraints(btn6, 2, 3);
GridPane.setConstraints(btn7, 0, 2);
GridPane.setConstraints(btn8, 1, 2);
GridPane.setConstraints(btn9, 2, 2);
GridPane.setConstraints(btn0, 0, 5);
GridPane.setConstraints(btnPerc, 4, 3);
GridPane.setConstraints(mem,0,0);
btn0.setOnKeyPressed((ke) -> {
if (ke.getCode() == KeyCode.DIGIT0) {
btn0.fireEvent(new ActionEvent());
}
});
btn0.setOnAction((ae) -> {
if (newNum) {
newNum = false;
str = "0";
tf.setText(str);
} else {
if (!str.equals("0")) {
str = str.concat("0");
tf.setText(str);
}
}
});
btn1.setOnAction((ae) -> {
if (newNum) {
newNum = false;
str = "1";
tf.setText(str);
} else {
if (!str.equals("0")) {
str = str.concat("1");
tf.setText(str);
} else {
str = "1";
tf.setText(str);
}
}
});
btn2.setOnAction(
(ae) -> {
if (newNum) {
newNum = false;
str = "2";
tf.setText(str);
} else {
if (!str.equals("0")) {
str = str.concat("2");
tf.setText(str);
} else {
str = "2";
tf.setText(str);
}
}
}
);
btn3.setOnAction(
(ae) -> {
if (newNum) {
newNum = false;
str = "3";
tf.setText(str);
} else {
if (!str.equals("0")) {
str = str.concat("3");
tf.setText(str);
} else {
str = "3";
tf.setText(str);
}
}
}
);
btn4.setOnAction(
(ae) -> {
if (newNum) {
newNum = false;
str = "4";
tf.setText(str);
} else {
if (!str.equals("0")) {
str = str.concat("4");
tf.setText(str);
} else {
str = "4";
tf.setText(str);
}
}
}
);
btn5.setOnAction(
(ae) -> {
if (newNum) {
newNum = false;
str = "5";
tf.setText(str);
} else {
if (!str.equals("0")) {
str = str.concat("5");
tf.setText(str);
} else {
str = "5";
tf.setText(str);
}
}
}
);
btn6.setOnAction(
(ae) -> {
if (newNum) {
newNum = false;
str = "6";
tf.setText(str);
} else {
if (!str.equals("0")) {
str = str.concat("6");
tf.setText(str);
} else {
str = "6";
tf.setText(str);
}
}
}
);
btn7.setOnAction(
(ae) -> {
if (newNum) {
newNum = false;
str = "7";
tf.setText(str);
} else {
if (!str.equals("0")) {
str = str.concat("7");
tf.setText(str);
} else {
str = "7";
tf.setText(str);
}
}
}
);
btn8.setOnAction(
(ae) -> {
if (newNum) {
newNum = false;
str = "8";
tf.setText(str);
} else {
if (!str.equals("0")) {
str = str.concat("8");
tf.setText(str);
} else {
str = "8";
tf.setText(str);
}
}
}
);
btn9.setOnAction(
(ae) -> {
if (newNum) {
newNum = false;
str = "9";
tf.setText(str);
} else {
if (!str.equals("0")) {
str = str.concat("9");
tf.setText(str);
} else {
str = "9";
tf.setText(str);
}
}
}
);
btnMinus.setOnAction(
(ae) -> {
eqvFlag = false;
if (newNum) {
if ((num1 != null) & (oper != ' ') & (num2 != null)) {
calculate(num1, num2, oper);
oper = '-';
tf.setText(str);
} else {
setNum1(str);
oper = '-';
}
} else {
newNum = true;
if (num1 == null) {
setNum1(str);
oper = '-';
tf.setText(str);
} else {
calculate(num1, Double.parseDouble(str), oper);
oper = '-';
tf.setText(str);
}
}
}
);
btnPlus.setOnAction(
(ae) -> {
eqvFlag = false;
if (newNum) {
if ((num1 != 0.0) & (oper != ' ') & (num2 != 0.0)) {
calculate(num1, num2, oper);
oper = '+';
tf.setText(str);
} else {
setNum1(str);
oper = '+';
}
} else {
newNum = true;
if (num1 == 0.0) {
setNum1(str);
oper = '+';
tf.setText(str);
} else {
calculate(num1, Double.parseDouble(str), oper);
oper = '+';
tf.setText(str);
}
}
}
);
btnDiv.setOnAction(
(ae) -> {
eqvFlag = false;
if (newNum) {
if ((num1 != 0.0) & (oper != ' ') & (num2 != 0.0)) {
calculate(num1, num2, oper);
oper = '/';
tf.setText(str);
} else {
setNum1(str);
oper = '/';
}
} else {
newNum = true;
if (num1 == 0.0) {
setNum1(str);
oper = '/';
tf.setText(str);
} else {
setNum2(str);
calculate(num1, Double.parseDouble(str), oper);
oper = '/';
tf.setText(str);
}
}
}
);
btnMult.setOnAction(
(ae) -> {
eqvFlag = false;
if (newNum) {
if ((num1 != 0.0) & (oper != ' ') & (num2 != 0.0)) {
calculate(num1, num2, oper);
oper = '*';
tf.setText(str);
} else {
setNum1(str);
oper = '*';
}
} else {
newNum = true;
if (num1 == 0.0) {
setNum1(str);
oper = '*';
tf.setText(str);
} else {
calculate(num1, Double.parseDouble(str), oper);
oper = '*';
tf.setText(str);
}
}
}
);
btnPerc.setOnAction(
(ae) -> {
eqvFlag = false;
if (newNum) {
setNum1(str);
oper = '%';
} else {
newNum = true;
if (num1 == 0.0) {
setNum1(str);
oper = '%';
tf.setText(str);
} else {
calculate(num1, Double.parseDouble(str), oper);
oper = '%';
tf.setText(str);
}
}
}
);
btnSqRoot.setOnAction(
(ae) -> {
eqvFlag = false;
if (newNum) {
if (num1 == 0.0) {
// Випадок коли намагаються вирахувати кв корінь із "0".
// Можливо краще нічого не виводити
setNum1(str);
calculateUno(num1, 'S');
tf.setText(str);
} else {
// Цей випадок очевидно не можливий
Double n2 = Math.sqrt(Double.parseDouble(str));
str = n2.toString();
tf.setText(str);
}
} else {
newNum = true;
if (num1 == 0.0) {
setNum1(str);
calculateUno(num1, 'S');
tf.setText(str);
} else {
num2 = Math.sqrt(Double.parseDouble(str));
str = num2.toString();
tf.setText(str);
}
}
}
);
btnPlusMin.setOnAction(
(ae) -> {
eqvFlag = false;
if (newNum) {
if (num1 == 0.0) {
// Випадок коли намагаються вирахувати обернене із "0".
// Можливо краще нічого не виводити
setNum1(str);
calculateUno(num1, 'M');
tf.setText(str);
} else {
// Цей випадок очевидно не можливий
num2 = Double.parseDouble(str) * -1;
str = num2.toString();
tf.setText(str);
}
} else {
newNum = true;
if (num1 == 0.0) {
setNum1(str);
calculateUno(num1, 'M');
tf.setText(str);
} else {
num2 = Double.parseDouble(str) * -1;
str = num2.toString();
tf.setText(str);
}
}
}
);
btnC.setOnAction(
(ae) -> {
eqvFlag = false;
str = "0";
newNum = true;
num1 = 0.0;
num2 = 0.0;
tf.setText(str);
}
);
btnComma.setOnAction(
(ae) -> {
CharSequence dot = ".";
if (!str.contains(dot)) {
eqvFlag = false;
newNum = false;
str = str.concat(".");
tf.setText(str);
}
}
);
btnBSpace.setOnAction(
(ae) -> {
if (eqvFlag == false & newNum == false) {
if (str.length() > 1 & !str.equals("-0")) {
str = str.substring(0, str.length() - 1);
tf.setText(str);
} else {
newNum = true;
if (num1 != 0.0) {
str = "0";
tf.setText(str);
} else {
str = "0";
tf.setText(str);
}
}
}
}
);
btnEquv.setOnAction(
(ae) -> {
eqvFlag = true;
if (newNum) {
if ((num1 != 0.0) & (oper != ' ') & (num2 != 0.0)) {
calculate(num1, num2, oper);
oper = ' ';
tf.setText(str);
} else {
setNum1(str);
oper = ' ';
}
} else {
newNum = true;
if (num1 == 0.0) {
setNum1(str);
oper = ' ';
tf.setText(str);
} else {
calculate(num1, Double.parseDouble(str), oper);
oper = ' ';
tf.setText(str);
}
}
}
);
btnMemMin.setOnAction(
(ae) -> {
try {
newNum = true;
mem.setText("M-");
if (numMem == null) {
numMem = Double.parseDouble(str);
} else {
numMem -= Double.parseDouble(str);
}
} catch (NumberFormatException nfe) {
str = "Is Not a Num";
tf.setText(str);
}
}
);
btnMemPlus.setOnAction(
(ae) -> {
try {
newNum = true;
mem.setText("M+");
if (numMem == null) {
numMem = Double.parseDouble(str);
} else {
numMem += Double.parseDouble(str);
}
} catch (NumberFormatException nfe) {
str = "Is Not a Num";
tf.setText(str);
}
}
);
btnMemC.setOnAction(
(ae) -> {
numMem = null;
mem.setText("");
}
);
btnMemR.setOnAction(
(ae) -> {
eqvFlag = false;
if (numMem != null) {
str = numMem.toString();
newNum = true;
tf.setText(str);
}
}
);
tf.setFont(
new Font(35.0));
tf.setOpacity(
1.0);
numPane.getChildren()
.addAll(
mem,btnC,
btnMemPlus,
btnMemMin,
btnMemR,
btnMemC,
btnPlus, btnMinus, btnDiv, btnMult, btnEquv, btnBSpace,
btnSqRoot,
btnPlusMin, btnPerc,
btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn0,
btnComma
);
scrPane.getChildren()
.add(tf);
rootNode.getChildren()
.addAll(scrPane, numPane);
myStage.show();
}
static Double setNum1(String st) {
num1 = Double.parseDouble(st);
return num1;
}
static Double setNum2(String st) {
num2 = Double.parseDouble(st);
return num2;
}
public static Double calculate(Double n1, Double n2, char op) {
Double nom1 = n1;
Double nom2 = n2;
switch (op) {
case ('+'):
num1 = n1 + n2;
str = num1.toString();
break;
case ('-'):
num1 = n1 - n2;
str = num1.toString();
break;
case ('*'):
num1 = n1 * n2;
str = num1.toString();
break;
case ('/'):
if (n2 != 0) {
num1 = n1 / n2;
str = num1.toString();
break;
} else {
str = "Div by 0 operation";
newNum = true;
num1 = 0.0;
num2 = 0.0;
oper = ' ';
break;
}
case ('%'):
num1 = n1 / 100 * n2;
str = num1.toString();
break;
case ('S'):
num1 = Math.sqrt(n1);
str = num1.toString();
break;
}
return num1;
}
public static Double calculateUno(Double n1, char op) {
Double nom1 = n1;
switch (op) {
case ('S'):
num1 = Math.sqrt(n1);
str = num1.toString();
break;
case ('M'):
num1 = -n1;
str = num1.toString();
break;
}
return num1;
}
}