본문 바로가기

PROGRAM/JAVA-SWING

#02 - 버튼배열 생성(계산기 프로그램)

계산기 만들기

소스코드

public class JavaExam {
    public static void main(String[] args) {
        new P02_Button();
    }
}
class P02_Button{  // JFrame을 상속받지 않은 예제
	JLabel label;
	JButton[] button;
    public P02_Button() {
        run();
    }
    private void run() {
        JFrame frame = new JFrame();
        JPanel panel_t = new JPanel();
        JPanel panel_c = new JPanel();
        label = new JLabel();
        label.setFont(new Font("굴림", Font.BOLD, 15));
        panel_t.setPreferredSize(new Dimension(frame.getWidth(),50));
        panel_t.add(label);
        
        panel_c.setLayout(new GridLayout(4, 4));
        button = new JButton[16];
        String[] titles = {"7","8","9","+",
                            "4","5","6","-",
                            "1","2","3","*",
                             "undo","0","=","/"};
        // 버튼 컴포넌트를 생성
        for(int i=0; i<titles.length; i++) {
        	button[i] = new JButton(titles[i]);
        	button[i].setPreferredSize(new Dimension(100,30));
        	button[i].addActionListener(new MyButtonClickListener());
            //버튼 글자크기 수정
        	button[i].setFont(new Font("굴림", Font.BOLD, 15));
        	panel_c.add(button[i]);
        }
        
        // 패널을 프레임에 붙이기
        frame.setLayout(new BorderLayout());
        frame.add(panel_t, BorderLayout.NORTH);
        frame.add(panel_c, BorderLayout.CENTER);

        //기본 창 꾸미기
        frame.setTitle("예제2-버튼");
        frame.setBounds(100, 100, 330, 400);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    //커스텀 리스너 생성으로 버튼 공동 작업
    private class MyButtonClickListener implements ActionListener {
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		
            // Object객체로 입력받아 객체비교
    		Object src=e.getSource();
            
    		if(src == button[12]) { //clear버튼
    			label.setText("");
    		}
    		else if(src == button[14]) {     // 계산(=)버튼
    			calcString(label.getText()); // 메소드를 사용하여 연산
    		}
    		else { // 나머지는 숫자값 및 연산식
        		JButton btn = (JButton)e.getSource();
        		String str = label.getText() + btn.getText();
        		label.setText(str);
    		}
//    		JOptionPane.showMessageDialog(null, btn.getText());
    	}
        
        //연산 메소드
    	private void calcString(String str) {
			String[] op = {"+","-","*","/"};
			String[] nums = new String[2];
			String op_ch="";
			for(int i=0; i<op.length;i++) {
				if(str.indexOf(op[i])>-1) { // 못찾으면 -1
					op_ch = op[i];
				}
			}
			switch (op_ch) {
			case "+":
				// split("+")가 동작하지 않아 "\\+"사용
				nums = str.split("\\+");
				label.setText(String.valueOf(
						Integer.parseInt(nums[0])+Integer.parseInt(nums[1])));
				break;
			case "-":
				nums = str.split("\\-");
				label.setText(String.valueOf(
						Integer.parseInt(nums[0])-Integer.parseInt(nums[1])));
				break;
			case "*":
				nums = str.split("\\*");
				label.setText(String.valueOf(
						Integer.parseInt(nums[0])*Integer.parseInt(nums[1])));
				break;
			case "/":
				nums = str.split("/");
                //0으로 나누는 예외처리
				if(Integer.parseInt(nums[1])==0) {
					JOptionPane.showMessageDialog(null, "0으로 나눌수 없습니다.");
					label.setText("");
				}
				else {
					label.setText(String.valueOf(
						Integer.parseInt(nums[0])/Integer.parseInt(nums[1])));
				}
                break;
			}
    	}
    }
}

레이아웃 : BorderLayout 사용

public class JavaExam {
    public static void main(String[] args) {
        new P03_Border();
    }
}

class P03_Border{
	public P03_Border() {
        run();
    }
    private void run() {
        JFrame frame = new JFrame();
        JPanel panel_t = new JPanel();
        JPanel panel_c = new JPanel();
        
        frame.setLayout(new BorderLayout());
        
        JLabel label = new JLabel("North", JLabel.CENTER);
        label.setFont(new Font("Courier", Font.BOLD, 36));
        //경계선 표시
        panel_t.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        panel_t.add(label);
        label = new JLabel("Center", JLabel.CENTER);
        label.setFont(new Font("Courier", Font.BOLD, 36));
        //경계선 표시
        panel_c.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        panel_c.add(label);
        
        frame.add(panel_t, BorderLayout.NORTH);
        frame.add(panel_c, BorderLayout.CENTER);

        //기본 창 꾸미기
        frame.setTitle("예제2-버튼");
        frame.setBounds(100, 100, 400, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

'PROGRAM > JAVA-SWING' 카테고리의 다른 글

KeyEvent  (0) 2022.09.20
Thread 2  (0) 2022.09.19
Thread  (0) 2022.09.15
#02 - 버튼 생성하기(JPanel / JButton / JLabel)  (0) 2022.09.07
#01 - 시작하기(JFrame)  (0) 2022.09.07