~예외처리 이어서~

 

 try ~ catch (+finally) 

- 던져진(throws) 예외를 잡거나, 발생된(throw) 예외를 잡아서 처리하는 문법

- try ~ catch 블록 안에서 발생한 예외는 해당 catch로 가서 처리된 후 finally 수행 후 나옴
   (*finally는 반드시 실행되어야 할 코드가 있을 때 사용함)

 

- 문법) try { *예외 발생 예상 코드 // 실행할 코드

           } catch ( 예외처리클래스명 객체명 ) {

             예외가 발생했을 때 처리할 코드  // 예외가 발생해야 수행됨

           } catch (Exception e) { // 예외처리 최상위 부모 클래스로, 놓친 예외를 잡을 수 있음.

             예외가 발생했을 때 처리할 코드 }

           } finally { // 선택적

             반드시 실행되어야 할 코드}

 

* catch는 예외처리클래스의 상속관계에 따라 자식클래스를 먼저 작성하고 부모클래스를 나중에 작성하자

 

* 예외 발생 예상 코드 : method를 보면 method가 날리는 예외 정보를 확인할 수 있음

  Ex) Integer Class의 parseInt method는 NumberFormatException을 throws하고 있음

       (=이 예외가 발생할 수 있다)

       > NumberFormatException은 RuntimeException이었기 때문에 try~catch를 하지 않더라도 쓸 수 있음

          CompileException이었으면 반드시 예외처리를 해주었어야 한다!!

 

Java API의 Integer Class의 parseInt method


# 오늘의 코딩 #

- RuntimeException을 확인해보자

/**
 * RuntimeException에 대해 처리
 * @author user
 */
public class UseRuntimeException {

	public static void main(String[] args) {
		// main method arguments 두개를 입력 받아 나눈 결과를 출력하는 일
		try {
		int num = Integer.parseInt(args[0]); //ArrayIndexOutOfBoundsException, NumberFormatException
		int num2 = Integer.parseInt(args[1]); //ArrayIndexOutOfBoundsException
		int result = 0;

		result = num / num2; // ArithmeticException
		System.out.println(num + "/" + num2 + "=" + result);
		} catch (ArrayIndexOutOfBoundsException aioobe) { // 입력값 안 넣으면 발생
			System.err.println("입력값은 2개 이어야 합니다.");
			System.err.println("사용 예) java UseRunTimeException 값1 값2");
		} catch (NumberFormatException nfe) {
			System.err.println("입력값은 숫자 형태이어야 합니다.");
			System.err.println("사용 예) java UseRunTimeException 숫자 숫자");
		} catch (ArithmeticException ae) {
			System.err.println("0으로 나눌 수 없습니다.");
		} catch (Exception e) { // 예외처리 객체의 최상위 부모. 모든 예외를 다 잡을 수 있음
			System.err.println("개발자가 인지하지 못 한 예외");
		} finally {
			System.out.println("무조건 실행되어야 하는 코드");
		}
	}// main

}// class

 

# 출력 결과 #

args 기입 종류에 따라서 catch문이 잘 실행되는 것을 확인!

finally에 있는 "무조건 실행되어야 하는 코드" 도 확인 ㅎㅎㅎ 

오늘은 너무나 주우우웅요한 예외처리!_!

 

 

 Exception Handling (예외처리) 

- Exception이란 ? 가벼운 에러

  (프로그램은 동작 중에 error가 발생하면 동작을 멈추지만 Exception이 발생하면 연속적인 동작을 할 수 있음)

- Error : 발생하면 프로그램이 정지하고 연속적인 사용이 불가능

- Excepton : 발생하면 프로그램이 정지하지만 대비 코드를 실행하여 연속적인 사용이 가능

 

- Compile ExceptionRuntime Exception이 있음

  • Compile Exception (컴파일 예외)
    - 개발자가 try ~ catch를 사용하여 반드시 처리해야 하는 예외
    - compile time에 처리되는 예외
    - bytecode가 제대로 생성되도록 처리하는 예외
  • Runtime Exception (런타임 예외)
    - 개발자가 try ~ catch를 하지 않더라도 JVM에서 자동으로 처리해주는 예외
      (하지만, 개발자가 인지하고! 반드시 처리! 해야한다!)
    - Memory에 할당된 후에 문제가 발생했을 때 처리하는 예외

* 모든 예외처리의 부모는 lang package의 Throwable Class 

 > 자식클래스로는 Error와 Exception이 있음

 > 예외의 부모가 Exception이면 CompileException

    예외의 부모가 RuntimeException이면 RuntimeException!

 

 

** 개발자가 인지하고 처리해야 할 RuntimeException의 대표를 정리해보자! ** 

  • ArithmeticException : 수를 0으로 나누는 경우 발생하는 예외
  • ArrayIndexOutOfBoundsException : 배열, java.util.List에 존재하지 않는 index를 사용할 때 발생하는 예외
  • NumberFormatException : 문자열을 숫자로 변경할 때 문자열이 숫자가 아닌 경우 발생하는 예외
  • NullPointerException : 참조형데이터형을 생성하지 않고 사용할 때 발생하는 예외

 File Dialog 

- 하드디스크에 존재하는 파일을 선택할 때 사용하는 컴포넌트

- java.awt package에서 제공

- OS에서 제공하는 FileDialog를 그대로 사용함

 

- 사용법)

1. 객체생성 :

   FileDialog fd = new FileDialog(부모 윈도우, “파일 다이얼로그 타이틀”, 모드);

   >> 모드 - 열기모드 사용 : FileDialog.LOAD

                     저장모드 사용 : FileDialog.SAVE

2. 가시화 : fd.setVisiable(true);

3. 파일의 경로 얻기 (파일이 어떤 폴더에 존재하는지) : String path = fd.getDirectory();

           >> 취소 버튼을 누르면 null이 반환됨 / null 확인 후 사용하는 코드 필수

4. 파일명 얻기 : String name = fd.getFile();

           >> 취소 버튼을 누르면 null이 반환됨 / null 확인 후 사용하는 코드 필수

 


# 오늘의 코딩 #

- FileDialog로 파일 경로를 가져와보쟈

import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

@SuppressWarnings("serial")
public class UseFileDialog extends JFrame implements ActionListener {

	private JButton jbtnOpen;
	private JButton jbtnSave;
	private JTextField jtf;

	public UseFileDialog() {

		jbtnOpen = new JButton("파일열기");
		jbtnSave = new JButton("파일저장");
		jtf = new JTextField();

		jtf.setBorder(new TitledBorder("파일 경로"));

		JPanel jpCenter = new JPanel();
		jpCenter.add(jbtnOpen);
		jpCenter.add(jbtnSave);

		add("Center", jpCenter);
		add("South", jtf);

		jbtnOpen.addActionListener(this);

		setBounds(100, 100, 500, 150);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}// UseFileDialog

	@Override
	public void actionPerformed(ActionEvent e) {

		if (e.getSource() == jbtnOpen) { // 파일열기 버튼 선택하면 파일경로를 가져와보자
			FileDialog fdOpen = new FileDialog(this, "파일열기",FileDialog.LOAD);
			fdOpen.setVisible(true);

			String path = fdOpen.getDirectory(); // 파일경로 
			String name = fdOpen.getFile(); // 파일이름
			
			if (path != null) { // 파일이 선택되었다면 텍스트필드에 파일 경로를 보여주자
				jtf.setText(path+name);
			} // end if
		} // end if
		
		if(e.getSource() == jbtnSave) { // 얜 스트림배우고 나서 해볼 예쩡!
			FileDialog fdSave = new FileDialog(this, "파일열기",FileDialog.SAVE);
		}//end if
		
	}// actionPerformed
	
	public static void main(String[] args) {
		new UseFileDialog();
	}// main

}// class

- 일단 간단한 다이얼로그를 만들고 파일열기/저장 버튼을 클림함에 따라 수행하는 일이 다르게 작성했다.

- 파일 저장은 스트림까지 마스터하고 추가해볼 예정!_!

 

# 출력 결과 #

 

실행하면 나오는 JDialog
파일열기 버튼을 클릭하면 파일을 선택할 수 있고
내가 선택한 파일의 경로를 가져올 수 있음

 


#9/04 코딩 추가

 - 스트림을 이용해서 파일을 저장해보자!!

- 기존 actionPerfomed method에서 파일저장 버튼 클릭시 수행할 내용을 추가했다.

		if (e.getSource() == jbtnSave) {
			FileDialog fdSave = new FileDialog(this, "파일저장", FileDialog.SAVE);
			fdSave.setVisible(true);

			String path = fdSave.getDirectory(); // 선택된 경로 가져오기
			String name = fdSave.getFile(); // 작성한 파일명 가져오기

			if (path == null) { // 취소 등 발생하면 return
				return;
			}//end if
			
			File file = new File(path); // 선택된 경로가 있으면 file 객체 생성

			BufferedWriter br = null;
			try {
				br = new BufferedWriter(new FileWriter(file + "/" + name)); // 스트림연결
				br.write("저장된 파일"); //쓸 내용
				br.flush(); // 목적지로 분출

				JOptionPane.showMessageDialog(this, "파일이 생성되었습니다."); // 사용자에게 알림

				br.close(); // 다 쓴 스트림 끊기
			} catch (IOException e1) {
				e1.printStackTrace();
			} // end catch

		} // end if

	}// actionPerformed

 

 

# 출력 결과 #

- 파일 저장 버튼을 클릭하면 save모드의 file dialog가 생성되고 파일 이름을 작성하여 저장을 누르면!!

- 파일이 잘 생성되었다는 메시지와 함께 저장된 파일을 확인할 수 있다!

 

'Development > Java' 카테고리의 다른 글

[Java] Exception Handling - Try~catch / Finally  (0) 2021.08.25
[Java] Exception Handling  (0) 2021.08.24
[Java] JOptionPane / JDialog  (0) 2021.08.22
[Java] Adapter Class  (0) 2021.08.20
[Java] Menu / Event Handling  (0) 2021.08.19

 1. JOptionPane 

- 간단한 Dialog을 제공하는 클래스 (InputDialog, MessageDialog, ConfirmDialog)

  • InputDialog : 사용자가 입력한 값을 받기위한 창
     >> String input = JOptionPane.showInputDialog(“메시지”);
  • MessageDialog : 간략한 정보를 제공하기 위한 창
    >> JOptionPane.showMessageDialog(부모컴포넌트, “메시지”);
  • ConfirmDialog : 사용자의 의중을 물어볼 수 있는 창
    >> int flag = JOptionPane.showConfirmDialog(부모컴포넌트,”메시지”)

 2. JDialog 

- 메인 창에서 부가적인 정보를 제공하기 위한 자식 창

- swing에는 JDialog(window component/생성자 있음)를 제공, AWT에서는 Dialog(생성자x)를 제공

- JDialog를 상속 받아 사용함

 >> JDialog는 부모창에서 동작을 해야하므로 has a 관계를 설정 (call by reference)

 >> *modal 설정 : 자식창이 동작했을 때 부모창의 활성화 여부

                        : 자식창이 동작했을 때 부모창을 사용할 수 없음

      *Non modal 설정 : 자식창이 동작했을 때 부모창 사용 가능


# 오늘의 코딩 #

public class UseJDialog extends JDialog implements ActionListener{

	private JButton jbtnClose;

	public UseJDialog(UseJOptionPane ujp) { // 다이얼로그창이 뜨려면 부모가 있어야 함
		super(ujp,"자식창",true); // true 는 modal type에 관한 것! modal로 설정!
		
		jbtnClose = new JButton("닫기");
		JPanel jpCenter = new JPanel();
		jpCenter.add(jbtnClose);
		
		//배치
		add("Center",jpCenter);
		
		//컴포넌트를 이벤트에 등록
		jbtnClose.addActionListener(this);
		
		//부모창의 좌표 얻기! getX(), getY()
		setBounds(ujp.getX(), ujp.getY(), 400, 300);
		setVisible(true);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}//UseDialog
	
	@Override
	public void actionPerformed(ActionEvent ae) {
		dispose(); // 버튼 누르면 다이얼로그는 닫기
	}//actionPerformed
	
}//class

- 부모창을 기반으로 JDiaog가 나오게 된다. 

'Development > Java' 카테고리의 다른 글

[Java] Exception Handling  (0) 2021.08.24
[Java] File Dialog  (0) 2021.08.23
[Java] Adapter Class  (0) 2021.08.20
[Java] Menu / Event Handling  (0) 2021.08.19
[Java] MVC Pattern  (0) 2021.08.18

 Adapter Class 

- 이벤트를 처리하기 위한 xxxListener가 하나 이상의 abstract method를 가지고 있을 때, 이 인터페이스 및 속해 있는 abstract method를 미리 구현(Override)해놓은 추상 클래스

- 개발자는 xxxAdapterClass를 상속받고 필요한 method만 구현하여 사용하면 됨

   (단, 단일 상속의 문제가 있음)

- xxxAdapter를 사용하면 has a 관계(=포함 Object 관계)의 이벤트 처리를 구현함

  >> 장점 : 디자인 클래스와 이벤트 처리 클래스를 분리하여 제작하고 처리할 수 있음

 

** 다른 객체의 기능을 사용하기 위해 해당 객체를 입력받아, 입력받은 객체명으로 기능을 사용하는 것 

   >>  is a OR has a 관계

   >>  장점 : 코드의 복잡도가 낮아진다!!! 


# 오늘의 코딩 #

- Addapter Class 를 알아보자!

public class UseAdapterEvent extends KeyAdapter {
	
...

	public void keyPressed(KeyEvent ke) {
		//이벤트가 발생했을 때 사용자에게 keyCode를 보여주는 제공할 코드
		int keyCode = ke.getKeyCode();
		JTextArea jta = ud.getJtaNameView();
		jta.append(String.valueOf(keyCode));
		jta.append("\n");
	}//keyPressed

}//class

- kyeEvent를 해보려고 사부작거린 code를 가져와봤다. 

 

자바 API 중 KeyAdapter Class

- KeyAdapter Class는 미리 KeyListener Interface를 구현해놓았기 때문에

KeyAdapter Class를 상속하면, method 중 하나를 선택해서 Override 가능하다!!! 

'Development > Java' 카테고리의 다른 글

[Java] File Dialog  (0) 2021.08.23
[Java] JOptionPane / JDialog  (0) 2021.08.22
[Java] Menu / Event Handling  (0) 2021.08.19
[Java] MVC Pattern  (0) 2021.08.18
[Java] Layout Manager (배치관리자)  (0) 2021.08.17

 1. Menu 

- 프로그램에서 제공하는 기능을 고정된 위치에서 한 번에 제공할 때 사용

- MenuBar, Menu, MenuItem 3가지로 구성

  • MenuBar : 메뉴를 저장하고 보여주는 일
  • Menu : 제공할 서비스의 그룹을 묶는 일
  • MenuItem : 제공할 기능 

- 사용법)

1) JMenuItem 생성

           JMenuItem jmi = new JmenuItem(“메뉴 아이템 이름”);

2) JMenu 생성

           JMenu jm = new JMenu(“메뉴 이름”);

3) JMenuItem을 JMenu에 배치

           jm.add(jmi);

    ** 메뉴 아이템간 구분선 설정(배치되는 JMenuItem이 구분되어야 할 때) :  jm.addSeparator();

4) JMenuBar를 생성

           JMenuBar jmb = new JMenuBar();

5) JMenuBar에 JMenu를 배치

           jmb.add(jm);

6) JMenuBar를 JFrame에 설정

           setMenuBar(jmb);

 

 2. Event Handling (이벤트 처리) 

- 사용자의 동작에 대응하는 실행코드를 작성하는 것

- 사용자의 동작은 xxListener라는 인터페이스에서 감지함

- java.awt.event패키지에서 관련 클래스를 제공

- swing에서 새로 추가된 컴포넌트의 이벤트는 javax.swing.event 패키지에서 관련 Class를 제공

동작 발생 이벤트(class) 처리 리스너(interface) 주로 발생하는 컴포넌트
버튼클릭,
엔터누름
ActionEvent ActionListener 클릭 : JButton, JComboBox
엔터 : JTextField, JPasswordField
윈도우 기능버튼
눌림
WindowEvent WindowListener JWindow, JDialog
키가 눌렸을 때 KeyEvent KeyListener JTextField, JPasswordField, JTextArea
마우스가 눌렸을때 MouseEvent MouseListener 모든 컴포넌트
마우스가 움직였을 때 MouseMotionEvnet MouseMotionListener 모든 컴포넌트
아이템이 선택되었을 때 ItemEvent ItemListener java.awt.List, java.awt.Choice

- 클래스는 JVM위에 있는데, 사용자 action을 listener하는 기능이 없으면 JVM은 액션을 무시함

- 이벤트 처리순서)

1. 발생한 이벤트를 처리할 청취인터페이스(xxxListener)를 구현

           public class Test extends JFrame implements ActionListener{ }

2. 인터페이스의 abstract method를 Override

           public void actionPerformed(ActionEvent ae) {

3. 컴포넌트를 이벤트에 등록하고, 이벤트가 발생했을 때 처리할 객체를 넣어줌
    컴포넌트(jbtn)를 이벤트에 등록(addXXXlistener)시키고 이벤트를 처리할 객체를 넣어줌

'Development > Java' 카테고리의 다른 글

[Java] File Dialog  (0) 2021.08.23
[Java] JOptionPane / JDialog  (0) 2021.08.22
[Java] Adapter Class  (0) 2021.08.20
[Java] MVC Pattern  (0) 2021.08.18
[Java] Layout Manager (배치관리자)  (0) 2021.08.17

 MVC Pattern 

- 클래스를 M(Model), V(View), C(Controller)의 역할로 나눠 작성하고 사용하는 개발방식

- 각 파일의 복잡도를 낮춰서 유지보수성을 향상시킨 구조

- 장점 : 유지보수가 편리 (프로그램의 생명이 길어짐)

- 단점 : 파일관리가 어려움, 값 전달 어려움, 에러 처리가 어려움, 개발 속도가 느림

  • M (Mode) : 데이터 처리를 하는 코드 / 데이터를 저장하고 관리하는 일
  • V (View) : 화면디자인을 처리하는 코드 / 데이터를 보여주는 일
  • C (Controller) : 업무처리를 하는 코드

- JList, JComboBox, JTable이 MVC Pattern을 적용하여 만든 컴포넌트

  -> 이 경우에는 컴포넌트에 직접 데이터 추가하는 것이 아니라, MODEL객체에 추가

 

- 사용법)

1. JList

  1) Model 객체 생성 (데이터를 가지고 처리하는 일)

     DefaultListModel<E> dlm = new DefaultListModel<E>(); // 데이터 추가, 삭제 : Model 객체 사용.

     dlm.addElement(값);

     dlm.getElementAt(인덱스); - 권장하는 method (or dlm.elementAt(인덱스) )

     dlm.remove(인덱스); or dlm.removeElementAt(인덱스); or dlm.removeElement(객체)

  2) View 객체 생성 (Model 객체를 할당하여 View 생성)

      JList<E> jl = new JList<E>(dlm) ;// Model과 View의 has a 관계

 

2. JComboBox

  1) Model 객체 생성 (데이터를 가지고 처리하는 일)

     DefaultComboBoxModel<E> dcbm = new DefaultComboBoxModel<E>() // 데이터 추가, 삭제 : Model 객체 사용.

     dcbm.addElement(값);

     dcbm.getElementAt(인덱스);

     dcbm.removeElement(객체); or dcbm.removeElementAt(인덱스);

  2) View 객체 생성 (Model 객체를 할당하여 View 생성)

     JComboBox<E> jc = new JComboBox<E>(dcbm);

 

3. JTable

  - DefaultTableModel은 여러 data가 들어갈 수 있으므로 Generic이 없음

  - JScrollPane을 사용하지 않으면 컬럼명이 제공되지 않음

  1) 객체화 : 컬럼명과 데이터를 넣어서 Model 클래스를 객체화

      String[] columnNames = {“번호”,”이름”,”나이”,”주소};

      String[][] data = { {“1”,”동동”,20”,”서울”}, {“”, “”, “”, “”} }

      DefaultTableModel dtm = new DefaultTableModel(data, columnNames);

  2) View 객체에 데이터를 가진 객체(Model)를 생성

      JTable jt = new Jtable ( dtm ); // has a 관계

  3) JScrollPane을 생성하여 배치

      JScrollPane jsp = new  JScrollPane(jt); 

      add(jsp);


# 오늘의 코딩 #

- JTable을 사용해보자!

package test;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 * JTable의 사용
 * @author user
 */
@SuppressWarnings("serial")
public class UseJTable extends JFrame {

	public UseJTable() {
		super("MVC Pattern을 도입한 클래스");
		
		//1. Model 객체 생성
		String[] columnNames = {"번호","이름","나이","주소"};
		String[][] data = {
				{"1","동","26","서울시 강남구"},
				{"2","서","25","서울시 송파구"},
				{"3","남","24","서울시 광진구"},
				{"4","북","26","수원시 영통구"},
		};
		DefaultTableModel dtm = new DefaultTableModel(data,columnNames);
		
		//2. 데이터(Model)를 넣어서 JTable(View)을 생성
		JTable jt = new JTable(dtm);
		JScrollPane jsp = new JScrollPane(jt);

        //3. 배치
		add("Center",jsp);// 스크롤페인 안 넣으면 컬럼명이 안 나옴
		
		//4. 크기설정
		setBounds(100,150,400, 300);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}//UseJTable
	
	public static void main(String[] args) {
		new UseJTable();
	}//main

}//class

 

- 얜 Model과 View객체에 따라 하는 일이 다르다!

 

# 출력 결과 #

 

 

'Development > Java' 카테고리의 다른 글

[Java] File Dialog  (0) 2021.08.23
[Java] JOptionPane / JDialog  (0) 2021.08.22
[Java] Adapter Class  (0) 2021.08.20
[Java] Menu / Event Handling  (0) 2021.08.19
[Java] Layout Manager (배치관리자)  (0) 2021.08.17

 Layout Manager (배치관리자) 

- 일반 컴포넌트를 Container Component나 Window Component에 배치하기 위해 제공하는 Class

- Container Component와 Window Component에서 적용할 수 있음

- 자동배치 관리자와 수동배치 관리자 두 가지를 사용할 수 있음

- setLayout method로 배치관리자를 적용함

 

자동배치 관리자

- 컴포넌트가 배치되는 크기와 위치가 결정되어 있는 관리자

- BorderLayout, FlowLayout, GridLayout, GridBagLayout, CardLayout 라는 Class 들이 제공됨

  (java.awt package)

- Non Visual Component : 사용자에게 컴포넌트 자체가 보이지 않음

 

1) BorderLayout (경계 레이아웃)
- Window Component (Window, Frame)의 기본 레이아웃
- 하나의 영역에 하나의 컴포넌트만 배치됨 (Center, 동서남북)
- 컴포넌트의 고유 크기가 무시되고, 배치되는 위치에 맞게 수정됨
   > Window의 크기를 변경하면 컴포넌트의 크기가 동일하게 늘어나거나 줄어듦
설정) setLayout (new BorderLayout() ); // 생략가능
컴포넌트 배치 문법) add(“배치할 위치”, 컴포넌트);
                            add(컴포넌트, 배치할 위치 상수);
 // 배치 위치를 설정하지 않으면 center에 들어감
  

2) FlowLayout (흐름 레이아웃)
- Container Component(Panel, ScrollPane)의 기본 레이아웃
- 윈도우의 크기가 줄어들면 컴포넌트의 위치가 위->아래로 변화됨(늘어나면 반대)
- 배치되는 컴포넌트의 크기는 고유크기를 가지고 배치됨
설정) setLayout(new FlowLayout());
- 컴포넌트 배치 문법) add(컴포넌트);
 // add하는 순서대로 배치

3) GridLayout (격자 레이아웃)
행과 열로 구분된 레이아웃
- 모든 행의 컴포넌트의 크기가 동일하게 설정되는 레이아웃
- 하나의 영역에는 하나의 컴포넌트가 배치됨
- 배치되는 컴포넌트의 크기는 고유크기가 무시되고 영역에 맞게 확장됨
설정) setLayout(new GridLayout(행,열));
컴포넌트 배치 문법) add(컴포넌트); // add하는 순서대로 왼->오른쪽으로 배치

4) GridBagLayout
- 행과 열로 구성된 레이아웃
- 행마다 열의 개수와 높이가 다름

 

5) CardLayout
- Container Component (Panel)에만 적용되는 레이아웃 (Window에서 적용 불가)
- 여러 개의 Panel중 사용자에게 하나의 Panel만 제공하는 레이아웃
- 한정적인 공간에 다양한 레이아웃을 보여줄 때 사용


# 오늘의 코딩 #

 

- Layout을 활용해서 휴대폰 전화 키패드를 찍어보자!
** java.awt.Font Class 를 활용하면 font 변경 가능! (style 및 size 포함) **

package test;

import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * GridLayout Class 활용
 * @author user
 */
// Window Component 상속
@SuppressWarnings("serial")
public class UseGridLayout extends JFrame {

	public UseGridLayout() {
		super("연습");

		// 컴포넌트 생성
		String[] data = "1,2,3,4,5,6,7,8,9,*,0,#".split(",");
		JButton[] jbtArr = new JButton[data.length];
		// 배치관리자 변경
		setLayout(new GridLayout(4, 3));
		//font 설정
		Font font = new Font("맑은 고딕",Font.BOLD,30);

		//버튼 배열에 숫자와 특수기호를 배치 및 폰트 적용하는 for문
		for (int i = 0; i < data.length; i++) {
			
			jbtArr[i] = new JButton(data[i]);

			add(jbtArr[i]);
			
			jbtArr[i].setFont(font);

		} // end for

		// 윈도우 크기 설정
		setSize(500, 400);
		// 가시화
		setVisible(true);
		// 윈도우 종료 이벤트 처리
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}// UseGridLayout

	public static void main(String[] args) {
		new UseGridLayout();
	}// main
}// class

- 배열을 사용하면 노가다를 안 해도 된다 ㅎㅎ

 

# 출력 결과 #

 

'Development > Java' 카테고리의 다른 글

[Java] File Dialog  (0) 2021.08.23
[Java] JOptionPane / JDialog  (0) 2021.08.22
[Java] Adapter Class  (0) 2021.08.20
[Java] Menu / Event Handling  (0) 2021.08.19
[Java] MVC Pattern  (0) 2021.08.18

+ Recent posts