본문 바로가기
IT/자바

연습문제 풀이

by 독서실총무J 2017. 6. 8.
반응형

월화수목금토일

중에서 목요일은 항상

기대가 되는 요일이 아닐까 싶다


다음날이 금요일이고 , 또 다음은

주말이라서 그런것 같다


금요일이 더 기대 되지 않냐고

생각할수 있겠지만 

내생각은 다르다


뭐랄까 다음날부터 주말이긴

하지만 정확한 계획이 없는

언제나 처럼 허무하지 않을까

라는 생각이 들기 때문이다


그러나 목요일은 다르다

오늘만 버티면 내일은

그냥 넘어갈수 있다


라는 생각이 곧잘 드는

그런 날이 아닐까 싶다


물론 지금의 나에게는

별로 필요없는 개념이지만

몇달전까지만 해도 그랬으니

하는 얘기이다


오늘은 저번에 배웠던 레이아웃들을

문제를 풀어보면서 복습하자


자바 전공 서적 중에 하나에서

연습문제로 나오는것이니


혹시나 자기가 풀고 있는 

것과 같다면 풀이를 비교해보자


첫번째부터 가보자


import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Answer1 extends JFrame {
	
	private JLabel lblText;
	private JButton btnCombo;
	private JButton btnPotato;
	private JButton btnBul;
	
	public Answer1() {
		init();
		setDisplay();
		showFrame();
	}
	
	private void init() {
		lblText = new JLabel(
			"자바피자에 오신것을 환영합니다. 피자를 고르세요.",
			JLabel.CENTER
		);
		btnCombo = new JButton("콤보피자");
		btnPotato = new JButton("포테이토피자");
		btnBul = new JButton("불고기피자");
	}

	private void setDisplay() {
		JPanel pnlCenter = new JPanel();
		pnlCenter.add(btnCombo);
		pnlCenter.add(btnPotato);
		pnlCenter.add(btnBul);
		
		add(lblText, BorderLayout.NORTH);
		add(pnlCenter, BorderLayout.CENTER);
	}

	private void showFrame() {
		setTitle("MyFrame");
		pack();
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
	}

	public static void main(String[] args) {
		new Answer1();
	}
}


정말 말그대로 창만 만드는것이다

아주 간단한 그런것 말이다


세개의 버튼을 만들고

그위에는 JLabel로 

피자점이라는것만 언급해주면 된다


어떤 레이아웃이 사용되었는지

주의깊게 보길 바란다


이벤트나 연산이 들어가지 않기 

때문에 이해하는데 어렵지 않을것이다


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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

public class Answer2 extends JFrame {

	private JLabel lblInput;
	private JTextField tfInput;
	
	private JButton btnCalc;
	
	private JTextField tfResult;
	
	public Answer2() {
		init();
		setDisplay();
		showFrame();
	}
	
	private void init() {
		lblInput = new JLabel("거리를 마일단위로 입력하시오");
		tfInput = new JTextField(5);
		btnCalc = new JButton("변환");
		// btnCalc.setEnabled(false);
		tfResult = new JTextField(15);
		// tfResult.setText("1마일은 1.6킬로미터입니다.");
		// JTextComponent
		// 편집 불가능
		tfResult.setEditable(false);
		// 비활성화
		// tfResult.setEnabled(false);
		tfResult.setBackground(Color.WHITE);
		tfResult.setBorder(new LineBorder(Color.GRAY, 1));
	}

	private void setDisplay() {
		JPanel pnlNorth = new JPanel();
		pnlNorth.add(lblInput);
		pnlNorth.add(tfInput);
		
		JPanel pnlCenter = new JPanel();
		pnlCenter.add(btnCalc);
		
		JPanel pnlSouth = new JPanel();
		pnlSouth.add(tfResult);
		
		
		add(pnlNorth, BorderLayout.NORTH);
		add(pnlCenter, BorderLayout.CENTER);
		add(pnlSouth, BorderLayout.SOUTH);
	}

	private void showFrame() {
		setTitle("마일을 킬로미터로 변환");
		pack();
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		// 창크기 고정
		setResizable(false);
		setVisible(true);
	}

	public static void main(String[] args) {
		new Answer2();
	}
}


마일을 킬로미터로 변환해보자

정말 정석적인 종류의 문제인것 같다


다음 3번째 문제에서 

연산에 대해 처리하는 부분이

나올것이니 결과창은 신경쓰지 말고


panel을 어떻게 나누는지 살펴보자

상하좌우에 어떻게 넣어줬는지 말이다


그것말고는 딱히 신경쓸것이 

없는 문제인것 같다


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class Answer3 extends JFrame implements ActionListener {
	
	private JLabel lblMoney;
	private JTextField tfMoney;
	private JLabel lblRate;
	private JTextField tfRate;
	
	private JButton btnCalc;
	
	private JTextField tfResult;
	
	public Answer3() {
		init();
		setDisplay();
		addListeners();
		showFrame();
	}
	
	private void init() {
		lblMoney = new JLabel("원금을 입력하시오", JLabel.LEFT);
		lblRate = new JLabel("이자율을 입력하시오", JLabel.LEFT);
		
		tfMoney = new JTextField(5);
		tfRate = new JTextField(5);
		
		btnCalc = new JButton("변환");
		
		tfResult = new JTextField(15);
		tfResult.setEditable(false);
		tfResult.setBackground(Color.WHITE);
	}

	private void setDisplay() {
		JPanel pnlLeft = new JPanel(new GridLayout(2, 1));
		pnlLeft.add(lblMoney);
		pnlLeft.add(lblRate);
		pnlLeft.setBorder(new EmptyBorder(0, 10, 0, 0));
		
		JPanel pnlRight = new JPanel(new GridLayout(2, 1));
		JPanel pnlMoney = new JPanel();
		pnlMoney.add(tfMoney);
		JPanel pnlRate = new JPanel();
		pnlRate.add(tfRate);
		pnlRight.add(pnlMoney);
		pnlRight.add(pnlRate);
		
		JPanel pnlSouth = new JPanel(new BorderLayout());
		
		JPanel pnlBtn = new JPanel();
		pnlBtn.add(btnCalc);
		JPanel pnlResult = new JPanel();
		pnlResult.add(tfResult);
		
		pnlSouth.add(pnlBtn, BorderLayout.NORTH);
		pnlSouth.add(pnlResult, BorderLayout.CENTER);
		
		
		add(pnlLeft, BorderLayout.WEST);
		add(pnlRight, BorderLayout.CENTER);
		add(pnlSouth, BorderLayout.SOUTH);
	}

	private void addListeners() {
		btnCalc.addActionListener(this);
	}
	
	private void showFrame() {
		setTitle("이자 계산기");
		pack();
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setResizable(false);
		setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		JTextField currentInput = null;
		try {
			
			currentInput = tfMoney;
			// 1. 원금을 가져온다.
			int money = Integer.parseInt(tfMoney.getText());
			
			currentInput = tfRate;
			// 2. 이자율을 가져온다.
			double rate = Double.parseDouble(tfRate.getText());
			
			// 3. 이자계산
			int interest = (int)(money * rate / 100);
			
			// 4. 결과 설정
			tfResult.setText(String.valueOf(interest));
		} catch(NumberFormatException nfe) {
			String name;
			if(currentInput == tfMoney) {
				name = "원금";
			} else {
				name = "이자율";
			}
			// tfResult.setText("숫자만 넣어라~(" + name + ")");
			
			/*
			 * JOptionPane.ERROR_MESSAGE
			 * JOptionPane.WARNING_MESSAGE
			 * JOptionPane.INFORMATION_MESSAGE
			 * JOptionPane.QUESTION_MESSAGE
			 * JOptionPane.PLAIN_MESSAGE 
			 */
			JOptionPane.showMessageDialog(
				this, 
				"숫자만 입력가능합니다.(" + name + ")", 
				"에러", 
				JOptionPane.ERROR_MESSAGE
			);
			
			// 커서를 올려라~
			currentInput.requestFocus();
			currentInput.selectAll();
		}
	}
	
	public static void main(String[] args) {
		new Answer3();
	}
}


이번에는 위에 2개보다는

조금더 생각해보아야 할 연습문제이다


특히 이벤트를 처리하는 부분은

개념만 잘 이해하면 쉽지만

제대로 알지 못하면 

직접 코딩하기 힘들것이다


그리고 예외에 대한 처리도 

dialog로 처리해주고 있다


panel을 나누는건 위에 두개에서

충분히 보았으니 여기선

연산과 이벤트 처리와 

어떻게 결과창에 띄웠는지 등등

에 대해서 주의깊게 보자


물론 몇번 쳐보다 보면 

이해가 더 쉬울것이다


짧은것 같지만 내 포스팅은 

항상 2천자가 넘는다


물론 코드의 힘이지만 

글을 읽는 당신에게

도움이 되었으면 좋겠다

반응형

댓글