티스토리 뷰

반응형
package prj190712;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.*;
import javax.swing.border.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.LayoutStyle.ComponentPlacement;

public class GUITE extends JFrame {

	private JPanel contentPane;
	private JTextField textField;
	private JButton button_1;
	private JButton button_2;
	private JButton btnBs;
	private JButton button_4;
	private JButton button_5;
	private JButton button_6;
	private JButton button_7;
	private JButton button_8;
	private JButton button_9;
	private JButton button_10;
	private JButton button_11;
	private JButton button_12;
	private JButton button_13;
	private JButton btnC_1;
	private JButton button_15;
	private JButton btnC;
	private JButton button_3;
	
	String[] str = new String[] {"","","","",""};
	
	double x=0; //소수점 계산해야함
	double y =0;
	double total = 0;
	boolean dot = false; //소수점 체크할 불린
	int dotchkx =0; //더블인지 아닌치 체크할분
	int dotchky =0; //더블인지 아닌치 체크할분
	char chk =' '; 
	
/*** Launch the application.*/
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					GUITE frame = new GUITE();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public GUITE() {
		
		setTitle("Calculator");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 385, 477);
		
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		JPanel panel = new JPanel();
		contentPane.add(panel, BorderLayout.CENTER);
		
		textField = new JTextField();
		textField.setColumns(10);
		
		
		
///////////////////////기호 부		
		
		JButton button = new JButton("/");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(str[0] != null) { //str[0]에 값이 들어있을때만 작동.
					str[1] = textField.getText(); //str1에 현재 텍스트 필드 안에 있는 텍스트들을 모조리 때려 넣는다. 
					textField.setText(""); //텍스트필드는 공백으로 초기화					
					dotchkx = str[1].indexOf(".");
					x = Double.parseDouble(str[1]);//str1에 있는 텍스트를 숫자 전환 하여 x에 넣는다. 
					str[0] = ""; //str0은 재활용 해야하니까 초기화
					chk = '/'; //연산 체크 할 기호를 chk에 넣어놓고 =이 눌리길 기다림
					dot = false; // 연산기호를 누르고 나면 소수점을 또 연산 할 수 있으니 소수점은 초기화
				}
			}
		});
		
		
		button_1 = new JButton("*");
		button_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(str[0] != null) {
					str[1] = textField.getText();
					dotchkx = str[1].indexOf(".");
					textField.setText("");
					x = Double.parseDouble(str[1]);
					str[0] = "";
					chk = '*';
					dot = false;
				}
			}
		});
		
		button_2 = new JButton("-");
		button_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(str[0] != null) {
					str[1] = textField.getText();
					dotchkx = str[1].indexOf(".");
					textField.setText("");
					x = Double.parseDouble(str[1]);
					str[0] = "";
					chk = '-';
					dot = false;
				}
			}
		});
		
		button_7 = new JButton("+");
		button_7.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(str[0] != null) {
					str[1] = textField.getText();
					textField.setText("");
					dotchkx = str[1].indexOf(".");//소수점 문자가 들어갔는지, 위치 인덱스로 판단할 것. 
					x = Double.parseDouble(str[1]);
					str[0] = "";
					chk = '+';
					dot = false;
				}
			}
		});
		
		btnBs = new JButton("b");
		btnBs.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(str[0] != "") {//당연하게도 공백이면 안됨
					int z = str[0].length(); //문자열 길이를 알아낸다.
					if(z > 1) 	{//1자리가 남았을때 b를 누르면 0으로 바뀌게 하고 싶음.
						str[0] = str[0].substring(0, z-1);//문자열에 지정한 범위에 속하는 문자열을 반환한다.(시작범위에 값은 포함하고, 끝나는 범위에 값은 포함하지않는다.)
						//그래서 마지막 길이 -1 번째를 반환하여 다시 str0에 넣기 때문에 
						// str0은 123->12만 보이게 되는것. 
						textField.setText(str[0]);												
					}										
					else {
						textField.setText("0"); //str0이 공백이면 0찍어버리기
						str[0] ="";
					}
					
				}			
			}
		});
		
		btnC_1 = new JButton("c");
		btnC_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				for(int i =0; i<str.length; i++) {//C눌리면 모든 문자열 초기화
					str[i] = "";
				}
				textField.setText("0"); //텍스트필드엔 0 찍을거임.
				dot = false;
			}
		});
		
		btnC = new JButton(".");
		btnC.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(str[0] != "" && !dot)  { //str0이 null이면 쓸모없고 dot 불린체크를 안하면 두번찍힐 수 있다. 
					str[0] += ".";//스트링에 .추가					
				}
				textField.setText(str[0]); //텍스트필드에 뿌려줌
				dot = true; //한 창에 두번 찍히는거 방지. 
			}			
		});
		
		button_3 = new JButton("=");
		button_3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(str[0] != "" ) { //당연하게도 str[0]이 공백이면 안된다. 
					dotchky = str[0].indexOf("."); //두번째 문자열도 소수점 체크는 해줘야 한다. 
					y	 = Double.parseDouble(str[0]); //x엔 기존에 받은 텍스트가 들어가있다. 그러니 str[0]을 새로이 y값에 변환하여 넣는다. 
					 str[0] = ""; //str0은 초기화
					 
					 switch(chk) { //각 기호가 눌렸을때 받은 chk 를 기준으로
					 case '+' : //+면 x+y하여 토탈에 넣고 브레이크
						  total = x+y;
						  break;
					 case '-' :
						  total = x-y;
						  break;
					 case '*' :
						  total = x*y;
						  break;
					 case '/' :
						 if(x != 0 && y != 0) {
							 total = (double) x/y; //0으로 나누지 못하게 if로 막아버리고 0으로 나눠지면 0출력됨
						 }
						 else total = 0;
						 break;
					 }					 
					 if(total<1 && total>0 || dotchkx>0 || dotchky>0) str[4] = String.valueOf(total); 
					 //x와 y에 소수점이 있는지 체크한다. 앞뒤 체크해야 해서 귀찮게 두개 만들음
					 // dotchkx나 dotchky  두 개 중 하나만 소수점이 있어도 
					 // 출력은 소수점으로 되어야 하고, 
					 // total값이 0.xx인데 1보다 작으면 소수점으로 출력
					 else str[4] = Integer.toString((int)total); //아닌경우 int로 변환하여 정수형 출력( -값 포함)
					 textField.setText(str[4]+""); //텍스트필드에 올려버림
					 dot = false;					 
					
				}
			}
		});
		
		
/////////////////////////////////숫자부		
		
		button_11 = new JButton("1");
		button_11.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				str[0] += "1"; //1이 눌리면 str0에 1을 쌓는다. 
				textField.setText(str[0]); //그리고 텍스트필드에 뿌려버림
			}				
		});
		
		button_12 = new JButton("2");
		button_12.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
					str[0] += "2";
					textField.setText(str[0]);				
			}
		});
		
		button_13 = new JButton("3");
		button_13.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
					str[0] += "3";						
					textField.setText(str[0]);				
			}
		});
		
		button_8 = new JButton("4");
		button_8.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				str[0] += "4";
				textField.setText(str[0]);
			}				
		});
		
		button_9 = new JButton("5");
		button_9.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				str[0] += "5";
				textField.setText(str[0]);
			}				
		});
		
		button_10 = new JButton("6");
		button_10.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				str[0] += "6";
				textField.setText(str[0]);
			}				
		});
		
		
		button_4 = new JButton("7");
		button_4.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				str[0] += "7";
				textField.setText(str[0]);
			}				
		});
		
		button_5 = new JButton("8");
		button_5.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				str[0] += "8";
				textField.setText(str[0]);
			}				
		});
		
		button_6 = new JButton("9");
		button_6.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				str[0] += "9";
				textField.setText(str[0]);
			}				
		});	
		
		button_15 = new JButton("0");
		button_15.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				str[0] += "0";
				textField.setText(str[0]);
			}
		});
		

//////////////////////////////////////////패널		

		GroupLayout gl_panel = new GroupLayout(panel);
		gl_panel.setHorizontalGroup(
			gl_panel.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel.createSequentialGroup()
					.addGroup(gl_panel.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_panel.createSequentialGroup()
							.addGap(12)
							.addComponent(textField, GroupLayout.PREFERRED_SIZE, 337, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_panel.createSequentialGroup()
							.addGap(25)
							.addGroup(gl_panel.createParallelGroup(Alignment.LEADING)
								.addGroup(gl_panel.createSequentialGroup()
									.addComponent(btnC_1, GroupLayout.PREFERRED_SIZE, 60, GroupLayout.PREFERRED_SIZE)
									.addGap(18)
									.addComponent(button_15, GroupLayout.PREFERRED_SIZE, 60, GroupLayout.PREFERRED_SIZE)
									.addGap(18)
									.addComponent(btnC, GroupLayout.PREFERRED_SIZE, 63, GroupLayout.PREFERRED_SIZE)
									.addGap(22))
								.addGroup(gl_panel.createSequentialGroup()
									.addGroup(gl_panel.createParallelGroup(Alignment.LEADING, false)
										.addGroup(Alignment.TRAILING, gl_panel.createSequentialGroup()
											.addPreferredGap(ComponentPlacement.RELATED)
											.addComponent(button, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
											.addGap(18)
											.addComponent(button_1, GroupLayout.PREFERRED_SIZE, 63, GroupLayout.PREFERRED_SIZE)
											.addPreferredGap(ComponentPlacement.UNRELATED)
											.addComponent(button_2, GroupLayout.PREFERRED_SIZE, 66, GroupLayout.PREFERRED_SIZE))
										.addGroup(gl_panel.createSequentialGroup()
											.addGroup(gl_panel.createParallelGroup(Alignment.TRAILING)
												.addGroup(gl_panel.createSequentialGroup()
													.addComponent(button_11, GroupLayout.PREFERRED_SIZE, 60, GroupLayout.PREFERRED_SIZE)
													.addGap(18)
													.addComponent(button_12, GroupLayout.PREFERRED_SIZE, 60, GroupLayout.PREFERRED_SIZE))
												.addGroup(gl_panel.createSequentialGroup()
													.addGroup(gl_panel.createParallelGroup(Alignment.LEADING, false)
														.addComponent(button_4, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
														.addComponent(button_8, GroupLayout.DEFAULT_SIZE, 60, Short.MAX_VALUE))
													.addGap(18)
													.addGroup(gl_panel.createParallelGroup(Alignment.LEADING, false)
														.addComponent(button_5, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
														.addComponent(button_9, GroupLayout.DEFAULT_SIZE, 60, Short.MAX_VALUE))))
											.addGap(18)
											.addGroup(gl_panel.createParallelGroup(Alignment.LEADING, false)
												.addComponent(button_10, GroupLayout.DEFAULT_SIZE, 63, Short.MAX_VALUE)
												.addComponent(button_13, GroupLayout.DEFAULT_SIZE, 63, Short.MAX_VALUE)
												.addComponent(button_6, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
									.addGap(22)))
							.addGroup(gl_panel.createParallelGroup(Alignment.LEADING)
								.addGroup(Alignment.TRAILING, gl_panel.createParallelGroup(Alignment.LEADING)
									.addComponent(btnBs, GroupLayout.DEFAULT_SIZE, 60, Short.MAX_VALUE)
									.addComponent(button_7, GroupLayout.DEFAULT_SIZE, 60, Short.MAX_VALUE))
								.addComponent(button_3, GroupLayout.PREFERRED_SIZE, 60, GroupLayout.PREFERRED_SIZE))
							.addGap(23)))
					.addGap(10))
		);
		gl_panel.setVerticalGroup(
			gl_panel.createParallelGroup(Alignment.LEADING)
				.addGroup(Alignment.TRAILING, gl_panel.createSequentialGroup()
					.addGap(10)
					.addComponent(textField, GroupLayout.PREFERRED_SIZE, 43, GroupLayout.PREFERRED_SIZE)
					.addGroup(gl_panel.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_panel.createSequentialGroup()
							.addGap(31)
							.addComponent(button, GroupLayout.PREFERRED_SIZE, 52, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_panel.createSequentialGroup()
							.addGap(36)
							.addGroup(gl_panel.createParallelGroup(Alignment.LEADING, false)
								.addComponent(button_2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
								.addComponent(button_1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
								.addComponent(btnBs, GroupLayout.DEFAULT_SIZE, 47, Short.MAX_VALUE))))
					.addPreferredGap(ComponentPlacement.RELATED, 14, Short.MAX_VALUE)
					.addGroup(gl_panel.createParallelGroup(Alignment.LEADING, false)
						.addComponent(button_4, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
						.addComponent(button_5, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
						.addComponent(button_6, GroupLayout.DEFAULT_SIZE, 55, Short.MAX_VALUE))
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)
						.addComponent(button_10, GroupLayout.PREFERRED_SIZE, 54, GroupLayout.PREFERRED_SIZE)
						.addComponent(button_9, GroupLayout.PREFERRED_SIZE, 54, GroupLayout.PREFERRED_SIZE)
						.addComponent(button_8, GroupLayout.PREFERRED_SIZE, 54, GroupLayout.PREFERRED_SIZE))
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)
						.addComponent(button_13, GroupLayout.PREFERRED_SIZE, 55, GroupLayout.PREFERRED_SIZE)
						.addComponent(button_12, GroupLayout.PREFERRED_SIZE, 55, GroupLayout.PREFERRED_SIZE)
						.addComponent(button_11, GroupLayout.PREFERRED_SIZE, 55, GroupLayout.PREFERRED_SIZE))
					.addPreferredGap(ComponentPlacement.RELATED, 7, GroupLayout.PREFERRED_SIZE)
					.addGroup(gl_panel.createParallelGroup(Alignment.LEADING)
						.addComponent(btnC_1, GroupLayout.PREFERRED_SIZE, 60, GroupLayout.PREFERRED_SIZE)
						.addComponent(button_15, GroupLayout.PREFERRED_SIZE, 60, GroupLayout.PREFERRED_SIZE)
						.addComponent(btnC, GroupLayout.PREFERRED_SIZE, 60, GroupLayout.PREFERRED_SIZE)
						.addComponent(button_3, GroupLayout.PREFERRED_SIZE, 60, GroupLayout.PREFERRED_SIZE))
					.addGap(28))
				.addGroup(Alignment.TRAILING, gl_panel.createSequentialGroup()
					.addGap(158)
					.addComponent(button_7, GroupLayout.DEFAULT_SIZE, 177, Short.MAX_VALUE)
					.addGap(94))
		);
		panel.setLayout(gl_panel);
	}
}

 

 

dot 구현 하긴 했는데 뭔가 부족함. 

변수안에 들어간 자료가 double인지 아닌지 체크를 하는거보다

문자열에 "." 이 들어가있으면 double로 출력하는게 낫지 않을까? 

 

문자열에 "."이 들어가있는지 위치정보 파악하려고 indexOf 연산자 사용, 

dot이 있는지 판단한다. (최소 한자리, 없으면 -1 회신)

 

결과 출력하는 = 기호에서 

x에 dot이있는지, y에 dot 이있는지 혹은 둘다 없는지 판단하여 

0보다 크면(있으면 1자리 이상이니까) double로 출력, 

0보다 작으면(없으면 -1 리턴) int로 출력. 

 

반응형

'JAVA' 카테고리의 다른 글

190715 Generics 예제  (0) 2019.07.15
190715 List, Iterator  (0) 2019.07.15
190711 JAVA Frame 상속, 좌표값 팝업+label로 나타내기  (0) 2019.07.11
190711 GUI, EventHandler 예제  (0) 2019.07.11
190711 Interface  (0) 2019.07.11