21.1.26(화) JAVA / GUI

민국·2021년 1월 26일
0

chap01_ Frame에 대하여(틀 만들기)

: 그래픽을 통해 사용자와 컴퓨터간의 인터페이스를 구현

1) 프레임 생성 방법 첫번째
: JFrame 객체를 직접 생성한 후 그 생성된 객체를 하나의 프레임으로 두는 방법
-> 생성된 객체를 통해서 프레임의 크기 및 위치 등등 변경


import javax.swing.JFrame;

public class MainFrame1 {
	
	public void showFrame() {
		
		// JFrame 객체 생성과 동시에 제목 설정
		JFrame mainFrame = new JFrame("Main Frame 1");
		
		mainFrame.setLocation(300, 200);
		mainFrame.setSize(800, 500);
		
		mainFrame.setVisible(true); // 창이 보여지게끔 하는 메소드
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
            //  닫기 버튼을 클릭했을 때 완벽하게 프로세스까지 종료되게끔
	}
}

<결과물>

2) 프레임 생성 방법 두번째
: javax.swing.JFrame 클래스를 상속받아 기본생성자에서 프레임에 대한 설정 진행

package com.kh.chap01_frame.view;

import javax.swing.JFrame;

public class MainFrame2 extends JFrame{
	
	public MainFrame2() {
		
		// 현재 이 객체 == this == 프레임
		//this.setLocation(500,700);
		//this.setSize(800,500);
		this.setBounds(500, 700, 800, 500); // 프레임 위치와 크기 설정 한꺼번에 하는 메소드
		
		this.setTitle("MainFrame2");
		
		this.setResizable(true); // 사이즈 재조정 여부
		
		this.setVisible(true); // 창이 보여지게끔 하는 메소드
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
                //  닫기 버튼을 클릭했을 때 완벽하게 프로세스까지 종료되게끔
	}
}

<결과물>

3) 프레임 생성 방법 세번째
: JPanel을 이용한 프레임 설정

package com.kh.chap01_frame.view;

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainFrame3 extends JFrame{
	public MainFrame3() {
		
		this.setBounds(200, 200, 500, 500);
		
		JPanel panel1 = new JPanel();
		JPanel panel2 = new JPanel();
		
		panel1.setBounds(0, 0, 250, 500);
		panel2.setBounds(250, 0, 250, 500);
		
		panel1.setBackground(Color.BLUE);
		panel2.setBackground(Color.RED);
		
		// 프레임 생성 뿐만이 아니라 직접 부착(추가)까지 해야 함
		this.add(panel1);
		this.add(panel2);
		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
}

<결과물>

: 이러한 방법은 요즘은 거의 사용하지 않지만, java 고유의 GUI를 통해 만들수 있음.

chap_02 Component(구성요소)

: 텍스트 입력 상자, 클릭 버튼

package com.kh.chap02_component.view;

import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MainFrame extends javax.swing.JFrame{
	
	public MainFrame() {
		
		this.setBounds(200, 200, 600, 300);
		
		JPanel panel = new JPanel();
		
		// JTextField : 기본적인 텍스트를 입력할 수 있는 상자
		JTextField id = new JTextField(20);
		panel.add(new JLabel("ID : "));
		panel.add(id);
		
		// 
		JPasswordField pw = new JPasswordField(20);
		panel.add(new JLabel("PW: "));
		panel.add(pw);
		
		JTextArea info = new JTextArea(10, 30);
		panel.add(new JLabel("자기소개 : "));
		panel.add(info);
		
		// JButton : 클릭 가능한 버튼
		JButton button = new JButton("전송");
		
		this.add(panel, "North"); // panel의 위치설정 : North
		this.add(button, "South"); // button의 위치설정 : South
		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

<결과물>

chap03_Event(이벤트 만들기)

: 프레임, 패널, 구성요소(component)를 만든 프로그램에 이벤트 만들기
=> 계산기 동작 만들기

package com.kh.chap03_event.view;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class MainFrame extends JFrame {
	public MainFrame() {
		
	this.setBounds(200, 200, 300, 200);
	
	this.setTitle("계산기");
	this.setResizable(false);
	
	JPanel inputPanel = new JPanel(); // 사용자에게 값을 입력받는 입력용 패널
	JPanel resultPanel = new JPanel(); // 사용자에게 결과값을 출력해주는 출력용 패널
	
	// 입력용 패널(InputPanel)에 부착할 내용
	JTextField num1 = new JTextField(15);
	JTextField num2 = new JTextField(15);
	
	inputPanel.add(new JLabel("첫번째 정수 : "));
	inputPanel.add(num1);
	inputPanel.add(new JLabel("두번째 정수 : "));
	inputPanel.add(num2);
	
	JPanel btnPanel = new JPanel(); // 버튼패널
	JButton plusBtn = new JButton("+");
	JButton minusBtn = new JButton("-");
	JButton multiplyBtn = new JButton("*");
	JButton divisionBtn = new JButton("/");
	
	btnPanel.add(plusBtn);
	btnPanel.add(minusBtn);
	btnPanel.add(multiplyBtn);
	btnPanel.add(divisionBtn);
	
	inputPanel.add(btnPanel);
	
	this.add(inputPanel); // 센터
	
	// 결과물 패널(OutputPanel) 에 부착할 내용
	JTextField result = new JTextField(15);
	resultPanel.add(new JLabel("결과 : "));
	resultPanel.add(result); // 남쪽
	
	// plusBtn 클릭시 => 두 개의 정수값 가져온 후 덧셈연산 후 결과를 result 텍스트 상자에 출력
	plusBtn.addActionListener(new ActionListener() { // 익명클래스 - 인터페이스기 때문에 곧바로 생성 불가
	                                                 // 단, 여기서 생성을 하고 싶다면 미완성된 걸
		                                         // 완성시키면서 생성하면 됨(익명클래스 방식)
		
		@Override 
		public void actionPerformed(ActionEvent e) {
			// plusBtn 클릭시 실행할 내용
			int value1 = Integer.parseInt(num1.getText()); // "10" --> 10 
			int value2 = Integer.parseInt(num2.getText());
			
			result.setText(value1 + value2 + "");
			
			// 텍스트필드.getText() : String => 해당 텍스트필드에 작성된 값을 가져오는 메소드
			// 텍스트필드.setText(String) => 해당 텍스트필드의 값을 수정해주는 메소드
			
		}
		
	});
	
	
	// minusBtn 클릭시 => 두 개의 정수값 가져온 후 뺄셈연산 후 결과를 result 텍스트 상자에 출력
	minusBtn.addActionListener(new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			// minusBtn 클릭시 실행할 내용
			result.setText(Integer.parseInt(num1.getText()) - Integer.parseInt(num2.getText()) + "");
		}
	});
	
	multiplyBtn.addActionListener(new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			// multiplyBtn 클릭시 실행할 내용
			result.setText(Integer.parseInt(num1.getText()) * Integer.parseInt(num2.getText()) + "");
		}
	});
	
	divisionBtn.addActionListener(new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			// divisionBtn 클릭시 실행할 내용
			result.setText(Integer.parseInt(num1.getText()) / Integer.parseInt(num2.getText()) + "");
		}
	});
	
	JLabel title = new JLabel("두개의 정수를 입력하시오", 0); // 북쪽 => 가운데정렬: (" ", 0) -> 0으로 초기화해야함
	
	this.add(title, "North");
	this.add(inputPanel, "Center"); 
	this.add(resultPanel, "South");
	
	this.setVisible(true);
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

*동작 만들기 방법(버튼에 이벤트 걸어주기)

버튼 누르면 액션 취하겠다는 메소드 : plusbtn.addActionListener(new ActionListener()); => ActionListener에서 객체생성 되지 않는다고 오류남 Why?
=> ActionListener는 인터페이스이다 (객체생성이 불가능한 인터페이스)
-인터페이스 : 미완성된 메소드가 있기 때문에 메소드를 따로 만드는 오버라이딩 작업을 해주어야 함(익명클래스 방식이라고 함) - 원래는 인터페이스를 구현하기위해서는 따로 클래스를 만들고 해야하지만 클래스 생성 없이 오버라이딩 작업으로 만들어주는 것(클래스가 익명이여서 익명클래스방식)
=> 어떻게 구현?? 아래와 같이
=> new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) { }

=> 입력한 두개의 정수를 가져와서 연산해주어야 함
: 텍스트 값에 담긴 num1, num2은 setText(문자값)의 반환형은 문자형(num1의 값이 10일때 setText로 호출하면 문자열 "10"을 반환해줌)이므로 문자형을 int(정수값)으로 변환시켜주는 파싱(parsing: String값 호출하면 int값으로 돌려주는 Integer.parseInt메소드 호출해야함) 과정이 필요함

=> 각 파싱된 num1과 num2를 연산하고,
int value1 = Integer.parseInt(num1.getText()); // "10" --> 10
int value2 = Integer.parseInt(num2.getText());

=> 이제 value1 , value2에 담긴값을 result를 통해 연산해주면 됨

=> 마지막으로, result.setText()에 담기는 값은 문자열(String)이여야 하므로 int value1과 int value2의 값에 연산된 것(+,-,*,/)을 숫자로 연산하고 뒤에 ""을 붙이면 문자열로 완성이 되므로 그 작업으로 마무리 하면 됨

result.setText(Integer.parseInt(num1.getText()) + Integer.parseInt(num2.getText()) + "");

<결과물>

<평상시>

<동작>

chap04_응용해보기

: chap03의 내용을 응용해서 새로운 내용 만들어보기

package com.kh.portfolio.view;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class ScoreFrame extends JFrame{
	public ScoreFrame() {
		
		this.setBounds(200, 200, 400, 200);
		
		this.setTitle("포트폴리오 문제");
		this.setResizable(false);
		
		JPanel inputPanel = new JPanel();
		JPanel outputPanel = new JPanel();
		
		// 타이틀
		JLabel title = new JLabel("점수를 입력하세요");
		
		// 입력용 패널
		JTextField java = new JTextField(10);
		JTextField SQL = new JTextField(10);
		
		inputPanel.add(new JLabel("자바 : "));
		inputPanel.add(java);
		inputPanel.add(new JLabel("SQL: "));
		inputPanel.add(SQL);
		
		// 버튼패널
		JPanel btnPanel = new JPanel();
		JButton button = new JButton("계산하기");
		btnPanel.add(button);
		
		inputPanel.add(button);
		
		
		// 출력용 패널
		JTextField total = new JTextField(10);
		JTextField average = new JTextField(10);
		
		outputPanel.add(new JLabel("총점 : "));
		outputPanel.add(total);
		outputPanel.add(new JLabel("평균 : "));
		outputPanel.add(average);
		
		// 계산 동작 구현
		button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				int value1 = Integer.parseInt(java.getText());
				int value2 = Integer.parseInt(SQL.getText());
				
				total.setText(value1 + value2 + "");
				average.setText((value1 + value2)/2 + "");
			}
		});
		
		
		this.add(title, "North");
		this.add(inputPanel, "Center");
		this.add(outputPanel, "South");
		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

<결과물>

profile
새싹개발자

0개의 댓글