: 그래픽을 통해 사용자와 컴퓨터간의 인터페이스를 구현
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를 통해 만들수 있음.
: 텍스트 입력 상자, 클릭 버튼
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);
}
}

: 프레임, 패널, 구성요소(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()) + "");
<평상시>

<동작>

: 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);
}
}
