На просторах Google я нашёл калькулятор, но он был в одну строчку и мне это не понравилось. Я решил сделать собственный калькулятор.
Начнём с того что нам понадобится два класса Main и класс в котором мы сделаем все кнопки, логику и всё остальное, в Main мы просто сделаем JFrame.
package com.company;
import javax.swing.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame("Калькулятор");//Создаёт JFrame
frame.setVisible(true);// делает его видимым
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//Это нужно для того чтобы мы могли его закрывать
frame.setSize(200, 220);// устанавливает размеры
frame.setResizable(false);//делает его неизменяемым по высоте и ширине
frame.setLocationRelativeTo(null);//создаёт его по середине экрана
}
}
Пока что это пустой JFrame, чтобы его наполнить, создадим другой класс Okno
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Okno extends JFrame {
}
теперь думаю в класс Main стоит добавить окно. этот код выдаст ошибку, но в будущем мы это исправим
package com.company;
import javax.swing.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame("Калькулятор");
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200, 220);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
new Okno(frame.getContentPane());//Здесь мы добавляем окно
}
}
Вернёмся в окну, пока что это тоже пустой JFrame думаю стоит добавить кнопки(JButton) и строки в которые невозможно ничего вписать с клавиатуры(JLabel). Пока что мы всё равно не сможем запустить код
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Okno extends JFrame {
JButton c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, delenie, umnozhenie, plus, minus, ravno, ochistit, drob, ochistit1, ochistit2;//кнопки
JLabel stroka, stroka1, stroka2;//строчки
}
Теперь кнопки надо ещё проинициализировать, для этого стоит выбрать менеджер для компонентов(кнопок и строк). Менеджер нужен для того чтобы создать порядок. Я выбрал GridBagConstraints. И ещё создадим необходимые переменные для калькулятора. Но перед этим я покажу как работают координаты в выбранном мною менеджере:
а теперь к коду который наконец-то работает:
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Okno extends JFrame {
JButton c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, delenie, umnozhenie, plus, minus, ravno, ochistit, drob, ochistit1, ochistit2;
JLabel stroka;
JLabel stroka1;
JLabel stroka2;
double pervoe;//переменная для первой цифры
double vtoroe;//переменная для второй цифры
double ravnu;//переменная для результата
boolean pl, mi, um, de;//переменные чтобы знать что делать с первой и второй цифрой, (порядок: pl-прибавить, mi-вычесть,um-умножить.de-делить
boolean chastpervovoChisla;//для того чтобы знать записана ли первая цифра от первого числа
boolean chastVtorovoChisla;//для того чтобы знать записана ли первая цифра от второго числа
boolean dva;//переменная чтобы знать в какую строку записывать число
public Okno(Container container) {// создание контейнера
container.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);//говорит как инициализировать компоненты(слева на право)
container.setLayout(new GridBagLayout());//выбирает менеджер
GridBagConstraints constraints = new GridBagConstraints();//вероятно создаёт менеджер(большую часть сверху я скопировал)
// По умолчанию натуральная высота, максимальная ширина ↓
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.weightx = 0.5;
constraints.gridy = 0;// нулевая ячейка таблицы по вертикали
c1 = new JButton("1");//в скобках написан текст который содержится на кнопке
constraints.gridx = 0;//расположение по х
constraints.gridy = 3;//расположение по у
container.add(c1, constraints);//добавление в контейнер
c2 = new JButton("2");
constraints.gridx = 1;
constraints.gridy = 3;
container.add(c2, constraints);
c3 = new JButton("3");
constraints.gridx = 2;
constraints.gridy = 3;
container.add(c3, constraints);
c4 = new JButton("4");
constraints.gridx = 3;
constraints.gridy = 3;
container.add(c4, constraints);
c5 = new JButton("5");
constraints.gridx = 0;
constraints.gridy = 4;
container.add(c5, constraints);
c6 = new JButton("6");
constraints.gridx = 1;
constraints.gridy = 4;
container.add(c6, constraints);
c7 = new JButton("7");
constraints.gridx = 2;
constraints.gridy = 4;
container.add(c7, constraints);
c8 = new JButton("8");
constraints.gridx = 3;
constraints.gridy = 4;
container.add(c8, constraints);
c9 = new JButton("9");
constraints.gridx = 0;
constraints.gridy = 5;
container.add(c9, constraints);
c0 = new JButton("0");
constraints.gridx = 1;
constraints.gridy = 5;
container.add(c0, constraints);
delenie = new JButton("/");
constraints.gridx = 2;
constraints.gridy = 5;
container.add(delenie, constraints);
umnozhenie = new JButton("*");
constraints.gridx = 3;
constraints.gridy = 5;
container.add(umnozhenie, constraints);
plus = new JButton("+");
constraints.gridx = 0;
constraints.gridy = 6;
container.add(plus, constraints);
minus = new JButton("-");
constraints.gridx = 1;
constraints.gridy = 6;
container.add(minus, constraints);
ravno = new JButton("=");
constraints.gridx = 2;
constraints.gridy = 6;
container.add(ravno, constraints);
ochistit = new JButton("c");
constraints.gridx = 3;
constraints.gridy = 6;
container.add(ochistit, constraints);
stroka = new JLabel("0");
constraints.gridwidth = 4;
stroka.setVerticalAlignment(SwingConstants.TOP);//это нужно чтобы текст в этой строке был сверху
stroka.setHorizontalAlignment(SwingConstants.RIGHT);//это нужно чтобы текст в этой строке был справа
constraints.gridx = 1;
constraints.gridy = 0;
container.add(stroka, constraints);
stroka1 = new JLabel("0");
constraints.gridwidth = 4;
stroka1.setVerticalAlignment(SwingConstants.TOP);
stroka1.setHorizontalAlignment(SwingConstants.RIGHT);
constraints.gridx = 1;
constraints.gridy = 1;
container.add(stroka1, constraints);
stroka2 = new JLabel("0");
constraints.gridwidth = 4;
stroka2.setVerticalAlignment(SwingConstants.TOP);
stroka2.setHorizontalAlignment(SwingConstants.RIGHT);
constraints.gridx = 1;
constraints.gridy = 2;
container.add(stroka2, constraints);
drob = new JButton(".");
constraints.gridwidth = 2;
constraints.gridx = 0;
constraints.gridy = 7;
container.add(drob, constraints);
ochistit1 = new JButton("c1");
constraints.gridwidth = 1;
constraints.gridx = 2;
constraints.gridy = 7;
container.add(ochistit1, constraints);
ochistit2 = new JButton("c2");
constraints.gridwidth = 1;
constraints.gridx = 3;
constraints.gridy = 7;
container.add(ochistit2, constraints);
}
}
Прекрасно, теперь кнопки видны. Для тех кто не понимает почему калькулятор не работает это всего лишь кнопки(Ауф), программа не знает что с ними делать. Чтобы программа знала что ей надо делать стоит добавить логику и сенсоры в сенсорах нам поможет класс унаследованный(вроде это как то по другому называется) от джава класса ActionListener. Его мы добавим сразу в класс Okno таким образом мы сразу передадим в него все переменные из класса Okno, и пожалуй добавим сенсер(слушатель) на кнопку 1.(Возможно надо будет поставить "}" в конце
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Okno extends JFrame {
JButton c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, delenie, umnozhenie, plus, minus, ravno, ochistit, drob, ochistit1, ochistit2;
JLabel stroka;
JLabel stroka1;
JLabel stroka2;
eOkoshko hren = new eOkoshko();//создаёт объект класса со слушателями(извиняюсь за название объекта)
double pervoe;
double vtoroe;
double ravnu;
boolean pl, mi, um, de;
boolean chastpervovoChisla;
boolean chastVtorovoChisla;
boolean dva;
public Okno(Container container) {
container.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
container.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.weightx = 0.5;
constraints.gridy = 0;
c1 = new JButton("1");
constraints.gridx = 0;
constraints.gridy = 3;
container.add(c1, constraints);
c2 = new JButton("2");
constraints.gridx = 1;
constraints.gridy = 3;
container.add(c2, constraints);
c3 = new JButton("3");
constraints.gridx = 2;
constraints.gridy = 3;
container.add(c3, constraints);
c4 = new JButton("4");
constraints.gridx = 3;
constraints.gridy = 3;
container.add(c4, constraints);
c5 = new JButton("5");
constraints.gridx = 0;
constraints.gridy = 4;
container.add(c5, constraints);
c6 = new JButton("6");
constraints.gridx = 1;
constraints.gridy = 4;
container.add(c6, constraints);
c7 = new JButton("7");
constraints.gridx = 2;
constraints.gridy = 4;
container.add(c7, constraints);
c8 = new JButton("8");
constraints.gridx = 3;
constraints.gridy = 4;
container.add(c8, constraints);
c9 = new JButton("9");
constraints.gridx = 0;
constraints.gridy = 5;
container.add(c9, constraints);
c0 = new JButton("0");
constraints.gridx = 1;
constraints.gridy = 5;
container.add(c0, constraints);
delenie = new JButton("/");
constraints.gridx = 2;
constraints.gridy = 5;
container.add(delenie, constraints);
umnozhenie = new JButton("*");
constraints.gridx = 3;
constraints.gridy = 5;
container.add(umnozhenie, constraints);
plus = new JButton("+");
constraints.gridx = 0;
constraints.gridy = 6;
container.add(plus, constraints);
minus = new JButton("-");
constraints.gridx = 1;
constraints.gridy = 6;
container.add(minus, constraints);
ravno = new JButton("=");
constraints.gridx = 2;
constraints.gridy = 6;
container.add(ravno, constraints);
ochistit = new JButton("c");
constraints.gridx = 3;
constraints.gridy = 6;
container.add(ochistit, constraints);
stroka = new JLabel("0");
constraints.gridwidth = 4;
stroka.setVerticalAlignment(SwingConstants.TOP);
stroka.setHorizontalAlignment(SwingConstants.RIGHT);
constraints.gridx = 1;
constraints.gridy = 0;
container.add(stroka, constraints);
stroka1 = new JLabel("0");
constraints.gridwidth = 4;
stroka1.setVerticalAlignment(SwingConstants.TOP);
stroka1.setHorizontalAlignment(SwingConstants.RIGHT);
constraints.gridx = 1;
constraints.gridy = 1;
container.add(stroka1, constraints);
stroka2 = new JLabel("0");
constraints.gridwidth = 4;
stroka2.setVerticalAlignment(SwingConstants.TOP);
stroka2.setHorizontalAlignment(SwingConstants.RIGHT);
constraints.gridx = 1;
constraints.gridy = 2;
container.add(stroka2, constraints);
drob = new JButton(".");
constraints.gridwidth = 2;
constraints.gridx = 0;
constraints.gridy = 7;
container.add(drob, constraints);
ochistit1 = new JButton("c1");
constraints.gridwidth = 1;
constraints.gridx = 2;
constraints.gridy = 7;
container.add(ochistit1, constraints);
ochistit2 = new JButton("c2");
constraints.gridwidth = 1;
constraints.gridx = 3;
constraints.gridy = 7;
container.add(ochistit2, constraints);
c1.addActionListener(hren);
c1.addActionListener(hren);//без этой строчки кнопка 1 работать не будет, сам точно не знаю что именно эта команда делает
}
public class eOkoshko implements ActionListener {//создаём класс
public void actionPerformed(ActionEvent e) {//обязательный метод
if (e.getSource() == c1) {//ставим сенсор на кнопку 1
stroka.setText("1");//говорим что надо сделать при нажатии на кнопку
}
}
}
Проверяем, теперь при нажатии на кнопку 1 первая строка изменяется(stroka) на 1, теперь стоит добавить логику благодаря которой можно будет писать любые численные переменные и кнопку очистить.
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Okno extends JFrame {
JButton c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, delenie, umnozhenie, plus, minus, ravno, ochistit, drob, ochistit1, ochistit2;
JLabel stroka;
JLabel stroka1;
JLabel stroka2;
eOkoshko hren = new eOkoshko();
double pervoe;
double vtoroe;
double ravnu;
boolean pl, mi, um, de;
boolean chastpervovoChisla;
boolean chastVtorovoChisla;
boolean dva;
public Okno(Container container) {
container.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
container.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.weightx = 0.5;
constraints.gridy = 0;
c1 = new JButton("1");
constraints.gridx = 0;
constraints.gridy = 3;
container.add(c1, constraints);
c2 = new JButton("2");
constraints.gridx = 1;
constraints.gridy = 3;
container.add(c2, constraints);
c3 = new JButton("3");
constraints.gridx = 2;
constraints.gridy = 3;
container.add(c3, constraints);
c4 = new JButton("4");
constraints.gridx = 3;
constraints.gridy = 3;
container.add(c4, constraints);
c5 = new JButton("5");
constraints.gridx = 0;
constraints.gridy = 4;
container.add(c5, constraints);
c6 = new JButton("6");
constraints.gridx = 1;
constraints.gridy = 4;
container.add(c6, constraints);
c7 = new JButton("7");
constraints.gridx = 2;
constraints.gridy = 4;
container.add(c7, constraints);
c8 = new JButton("8");
constraints.gridx = 3;
constraints.gridy = 4;
container.add(c8, constraints);
c9 = new JButton("9");
constraints.gridx = 0;
constraints.gridy = 5;
container.add(c9, constraints);
c0 = new JButton("0");
constraints.gridx = 1;
constraints.gridy = 5;
container.add(c0, constraints);
delenie = new JButton("/");
constraints.gridx = 2;
constraints.gridy = 5;
container.add(delenie, constraints);
umnozhenie = new JButton("*");
constraints.gridx = 3;
constraints.gridy = 5;
container.add(umnozhenie, constraints);
plus = new JButton("+");
constraints.gridx = 0;
constraints.gridy = 6;
container.add(plus, constraints);
minus = new JButton("-");
constraints.gridx = 1;
constraints.gridy = 6;
container.add(minus, constraints);
ravno = new JButton("=");
constraints.gridx = 2;
constraints.gridy = 6;
container.add(ravno, constraints);
ochistit = new JButton("c");
constraints.gridx = 3;
constraints.gridy = 6;
container.add(ochistit, constraints);
stroka = new JLabel("0");
constraints.gridwidth = 4;
stroka.setVerticalAlignment(SwingConstants.TOP);
stroka.setHorizontalAlignment(SwingConstants.RIGHT);
constraints.gridx = 1;
constraints.gridy = 0;
container.add(stroka, constraints);
stroka1 = new JLabel("0");
constraints.gridwidth = 4;
stroka1.setVerticalAlignment(SwingConstants.TOP);
stroka1.setHorizontalAlignment(SwingConstants.RIGHT);
constraints.gridx = 1;
constraints.gridy = 1;
container.add(stroka1, constraints);
stroka2 = new JLabel("0");
constraints.gridwidth = 4;
stroka2.setVerticalAlignment(SwingConstants.TOP);
stroka2.setHorizontalAlignment(SwingConstants.RIGHT);
constraints.gridx = 1;
constraints.gridy = 2;
container.add(stroka2, constraints);
drob = new JButton(".");
constraints.gridwidth = 2;
constraints.gridx = 0;
constraints.gridy = 7;
container.add(drob, constraints);
ochistit1 = new JButton("c1");
constraints.gridwidth = 1;
constraints.gridx = 2;
constraints.gridy = 7;
container.add(ochistit1, constraints);
ochistit2 = new JButton("c2");
constraints.gridwidth = 1;
constraints.gridx = 3;
constraints.gridy = 7;
container.add(ochistit2, constraints);
c1.addActionListener(hren);
c2.addActionListener(hren);
c3.addActionListener(hren);
c4.addActionListener(hren);
c5.addActionListener(hren);
c6.addActionListener(hren);
c7.addActionListener(hren);
c8.addActionListener(hren);
c9.addActionListener(hren);
c0.addActionListener(hren);
ochistit.addActionListener(hren);
}
public class eOkoshko implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == c1) {
if (!dva && !chastpervovoChisla) {//переменная dva нужна чтобы знать в какую строку записывать цифры
stroka.setText("1");
chastpervovoChisla = true;
} else if (!dva && chastpervovoChisla) {
String dl1 = (stroka.getText());//эта строчка берёт значение строки
dl1 = dl1 + "1";//а эта добавляет цифру 1 но конец
stroka.setText(dl1);// а эта присваивает строке значение переменной(которая равна строке + 1
} else if (dva && !chastVtorovoChisla) {// код отсюда
stroka1.setText("1");
chastVtorovoChisla = true;
} else if (dva && chastVtorovoChisla) {
String dl2 = (stroka1.getText());
dl2 = dl2 + "1";
stroka1.setText(dl2);
}//до сюда нужен чтобы записывать еденицу во вторую строку(stroka2), но пока вписать во вторую строку нечего не получится, во вторую строку вписывается число только после того как буден выбран знак(+, -, *, /)
}
if (e.getSource() == c2) {
if (!dva && !chastpervovoChisla) {
stroka.setText("2");
chastpervovoChisla = true;
} else if (!dva && chastpervovoChisla) {
String dl1 = (stroka.getText());
dl1 = dl1 + "2";
stroka.setText(dl1);
} else if (dva && !chastVtorovoChisla) {
stroka1.setText("2");
chastVtorovoChisla = true;
} else if (dva && chastVtorovoChisla) {
String dl2 = (stroka1.getText());
dl2 = dl2 + "2";
stroka1.setText(dl2);
}
}
if (e.getSource() == c3) {
if (!dva && !chastpervovoChisla) {
stroka.setText("3");
chastpervovoChisla = true;
} else if (!dva && chastpervovoChisla) {
String dl1 = (stroka.getText());
dl1 = dl1 + "3";
stroka.setText(dl1);
} else if (dva && !chastVtorovoChisla) {
stroka1.setText("3");
chastVtorovoChisla = true;
} else if (dva && chastVtorovoChisla) {
String dl2 = (stroka1.getText());
dl2 = dl2 + "3";
stroka1.setText(dl2);
}
}
if (e.getSource() == c4) {
if (!dva && !chastpervovoChisla) {
stroka.setText("4");
chastpervovoChisla = true;
} else if (!dva && chastpervovoChisla) {
String dl1 = (stroka.getText());
dl1 = dl1 + "4";
stroka.setText(dl1);
} else if (dva && !chastVtorovoChisla) {
stroka1.setText("4");
chastVtorovoChisla = true;
} else if (dva && chastVtorovoChisla) {
String dl2 = (stroka1.getText());
dl2 = dl2 + "4";
stroka1.setText(dl2);
}
}
if (e.getSource() == c5) {
if (!dva && !chastpervovoChisla) {
stroka.setText("5");
chastpervovoChisla = true;
} else if (!dva && chastpervovoChisla) {
String dl1 = (stroka.getText());
dl1 = dl1 + "5";
stroka.setText(dl1);
} else if (dva && !chastVtorovoChisla) {
stroka1.setText("5");
chastVtorovoChisla = true;
} else if (dva && chastVtorovoChisla) {
String dl2 = (stroka1.getText());
dl2 = dl2 + "5";
stroka1.setText(dl2);
}
}
if (e.getSource() == c6) {
if (!dva && !chastpervovoChisla) {
stroka.setText("6");
chastpervovoChisla = true;
} else if (!dva && chastpervovoChisla) {
String dl1 = (stroka.getText());
dl1 = dl1 + "6";
stroka.setText(dl1);
} else if (dva && !chastVtorovoChisla) {
stroka1.setText("6");
chastVtorovoChisla = true;
} else if (dva && chastVtorovoChisla) {
String dl2 = (stroka1.getText());
dl2 = dl2 + "6";
stroka1.setText(dl2);
}
}
if (e.getSource() == c7) {
if (!dva && !chastpervovoChisla) {
stroka.setText("7");
chastpervovoChisla = true;
} else if (!dva && chastpervovoChisla) {
String dl1 = (stroka.getText());
dl1 = dl1 + "7";
stroka.setText(dl1);
} else if (dva && !chastVtorovoChisla) {
stroka1.setText("7");
chastVtorovoChisla = true;
} else if (dva && chastVtorovoChisla) {
String dl2 = (stroka1.getText());
dl2 = dl2 + "7";
stroka1.setText(dl2);
}
}
if (e.getSource() == c8) {
if (!dva && !chastpervovoChisla) {
stroka.setText("8");
chastpervovoChisla = true;
} else if (!dva && chastpervovoChisla) {
String dl1 = (stroka.getText());
dl1 = dl1 + "8";
stroka.setText(dl1);
} else if (dva && !chastVtorovoChisla) {
stroka1.setText("8");
chastVtorovoChisla = true;
} else if (dva && chastVtorovoChisla) {
String dl2 = (stroka1.getText());
dl2 = dl2 + "8";
stroka1.setText(dl2);
}
}
if (e.getSource() == c9) {
if (!dva && !chastpervovoChisla) {
stroka.setText("9");
chastpervovoChisla = true;
} else if (!dva && chastpervovoChisla) {
String dl1 = (stroka.getText());
dl1 = dl1 + "9";
stroka.setText(dl1);
} else if (dva && !chastVtorovoChisla) {
stroka1.setText("9");
chastVtorovoChisla = true;
} else if (dva && chastVtorovoChisla) {
String dl2 = (stroka1.getText());
dl2 = dl2 + "9";
stroka1.setText(dl2);
}
}
if (e.getSource() == c0) {
if (!dva && chastpervovoChisla) {
String dl1 = (stroka.getText());
dl1 = dl1 + "0";
stroka.setText(dl1);
} else if (dva && chastVtorovoChisla) {
String dl2 = (stroka1.getText());
dl2 = dl2 + "0";
stroka1.setText(dl2);
}
}
if (e.getSource() == ochistit) {
chastpervovoChisla = false;
stroka.setText("0");//эти три
stroka1.setText("0");//строки
stroka2.setText("0");//очищают stroka,stroka1,stroka2
dva = false;//эта строка делает так что всё начинается записываться в первую строку (stroka)
chastpervovoChisla = false;
chastVtorovoChisla = false;
ravnu = 0.0;
pervoe = 0.0;
vtoroe = 0.0;
}
}
}
Отлично, теперь он что-то пишет. Осталось добавить знаки(плюс, минус, умножить, делить) и дроби.
Но есть одна проблема полный калькулятор не поместился поэтому следующий и последний шаг вы найдёте в этой лекции: https://javarush.com/forum/788