*기본 계산기앱은 블로그는 (3)이 끝입니다.
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
public class AppCal extends JFrame {
// AppCal클래스의 필드
private JTextArea printInputtedCalculation = new JTextArea();// 수식을 화면에 보여주는 JTextField 컴포넌트
private JButton [] calculationNumberButton = new JButton[10]; // 숫자에 해당하는 버튼들
private JButton [] calculationButton = {
new JButton("<-(All)"), new JButton("계산"),
new JButton("+"), new JButton("-"), new JButton("×"), new JButton("÷")
};// 연산기호에 해당하는 버튼들
private JTextField printResultCalculation = new JTextField();// 계산 결과를 출력하는 컴포넌트
// AppCal클래스의 생성자
public AppCal(){
setTitle("계산기 프로그램");// 제목을 계산기 프로그램이라는 이름 설정하기
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 창닫기버튼 클릭시 프로그램 종료
Container contentpane = getContentPane();// 콘텐트팬을 가져오기 => 여기서 gui프로그램을 만든다.
contentpane.setLayout(new BorderLayout());// 레이아웃을 BorderLayout으로 설정한다.
contentpane.add(new InputtedCalculation(), BorderLayout.NORTH);//북쪽에 계산식을 보여주는 패널을 부착한다.
contentpane.add(new ResultOfCalculation(), BorderLayout.SOUTH);// 계산결과를 알려주는 패널을 부착한다.
contentpane.add(new CalculationButton(), BorderLayout.CENTER);// 중앙에 계산기에 필요한 숫자들과 사칙연산기호등... 버튼들이 있는 패널을 부착한다.
setSize(380,260);//프로그램 실행시 창을 가로360픽셀, 세로 260픽셀크기로 한다.
setVisible(true);// 창을 화면에 보이도록 설정한다.
}
// AppCal클래스의 내부 클래스로 JPanel을 상속받아 InputtedCalculation 패널클래스구현(계산식(계산수식)을 보여준다.)
private class InputtedCalculation extends JPanel{
public InputtedCalculation(){
setLayout(new GridLayout(1,2)); // 1행과 2렬로 구성된 grid배치관리자로 설정했다.
setBackground(Color.LIGHT_GRAY);// 배경색을 LIGHT_GRAY로 설정했다.(밝은 회색)
add(new JLabel("계산식"));// 라벨의 텍스트를 게산식으로 설정해서 부착했다.
printInputtedCalculation.setEditable(false);// 사용자가 JTextField를 수정하지못하도록 설정했다.
add((printInputtedCalculation)); // JTextArea를 부착했다.
}
}
// AppCal클래스의 내부 클래스로 JPanel을 상속받아 CalculationButton 패널클래스구현(계산기의 버튼들을 만든다.)
private class CalculationButton extends JPanel{
public CalculationButton(){
int i;
setLayout(new GridLayout(4,4,3,3));// 4행과 4렬로 구성된 grid배치관리자로 설정했다.추가로 상하좌우 간격을 각각 3픽셀씩 간격을 두도록 했다.
for (i = 0; i < calculationNumberButton.length; i++)// 0~9까지의 텍스트를 가지는 각각 버튼을 부착하는 반복문이다.(+나중에는 이벤트리스너를 구현해서 처리를 할 것 이다.)
{
calculationNumberButton[i] = new JButton(Integer.toString(i)); // 숫자는 반복되는데 텍스트를 넣어야하기에 숫자를 문자열로 바꿔 JButton의 인수에 넣었다.
add(calculationNumberButton[i]);// 숫자에 해당하는 버튼 부착
calculationNumberButton[i].addActionListener(new calculatorButtonActionListener(false));// 아직 미완
}
for (i = 0; i < calculationButton.length; i++)// 연산기호에 해당하는 텍스트를 가지는 각각 버튼을 부착하는 반복문이다.(+나중에는 이벤트리스너를 구현해서 처리를 할 것 이다.)
{
add(calculationButton[i]);// 연산기호에 해당하는 버튼 부착
if (i>=2)
calculationButton[i].addActionListener(new calculatorButtonActionListener(true));// 사칙연산기호에 해당 이벤트 리스너를 적용했다.
}
calculationButton[0].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
JButton button = (JButton)actionEvent.getSource();
printInputtedCalculation.setText("");
}
});
calculationButton[1].addActionListener(new calculatorActionListener());
}
private class calculatorButtonActionListener implements ActionListener{
private boolean operationalSymbols;
public calculatorButtonActionListener(boolean operationalSymbols){
this.operationalSymbols = operationalSymbols;
}
@Override
public void actionPerformed(ActionEvent actionEvent) {
// 이벤트가 발생하면 해당버튼 숫자를 불러와 printInputtedCalculation에 출력한다.
// 우선 해당버튼 객체를 불러온다. 그 객체 문자를 가져와 printInputtedCalculation에 출력
JButton button = (JButton)actionEvent.getSource();
if (operationalSymbols)
printInputtedCalculation.append(" " + button.getText() + " ");
else
printInputtedCalculation.append(button.getText());
}
}
private class calculatorActionListener implements ActionListener{
private String [] calculationElements = printInputtedCalculation.getText().split(" ");
private ArrayList<String> calculationElements1 = new ArrayList<String>();
@Override
public void actionPerformed(ActionEvent actionEvent) {
// 계산버튼
// 먼저 문자열 전체부분을 가져온다. 그래서 공백기준으로 쪼개서 넣는다.
// 반복문 for 안에서 ~~
// 홀수부분이 연산자, 짝수부분이 피연산자 개수를 파악할 수 있다. size()로 개수도 파악가능하고 인덱스도 파악가능하다. => 이걸 반복문에서 자체로 걸려서 인덱스로 대입을 할지 contain을 해서 안에서 할지
//
}
}
}
// AppCal클래스의 내부 클래스로 JPanel을 상속받아 ResultOfCalculation 패널클래스구현()
private class ResultOfCalculation extends JPanel{
public ResultOfCalculation(){
setLayout(new GridLayout(1,2));// 1행과 2렬로 구성된 grid배치관리자로 설정했다.
setBackground(Color.ORANGE);// 배경색을 ORANGE로 설정했다.(오렌지)
add(new JLabel("계산결과"));// 라벨의 텍스트를 게산결과로 설정해서 부착했다.
printResultCalculation.setEditable(false);// 사용자가 JTextField를 수정하지못하도록 설정했다.
add(printResultCalculation);
}
}
public static void main(String[] args) {
new AppCal();
}// 메인메소드에서 AppCal클래스 생성자를 실행시켰다.
}
이벤트처리부분과 사칙연산을 고려해서 넣는게 쉽진않네요..
'프로그래밍 언어 > java' 카테고리의 다른 글
java 사각형 스탬프 랜덤 찍기 프로그램 (0) | 2021.02.16 |
---|---|
JAVA 더블클릭시, 도망가는 라벨 프로그램 (0) | 2021.02.02 |
java 파일처리(1) - 파일복사 프로그램 (0) | 2021.01.20 |
수강신청 프로그램 제작 - (3) (0) | 2021.01.13 |
java실습 - 계산기(1) (0) | 2021.01.12 |