Java/고급객체지향

고급객체지향 프로그래밍 - 스윙 (Swing)

얄루몬 2021. 10. 18. 23:58

스윙 (Swing)

 

스윙이란?
자바에 기본으로 포함된 GUI 프로그래밍 라이브러리로 컴포넌트가 자바로 작성되어 있어서 크로스 플랫폼을 지원한다.
옵저버패턴과 함께 연관되어 있으니 같이 공부해야 한다.

 

메소드 설명(자주 사용되는 컴포넌트 클래스의 메소드)

void add(Component c) - 컴포넌트에 주어진 컴포넌트 c를 추가

void setSize(int width, int height) - 컴포넌트의 너비와 높이 크기 지정

void setLayout(LayoutManager m) - 컴포넌트의 레이아웃 매니저 지정

void setVisible(boolean b) - 컴포넌트를 화면에 보일 것인지 지정. 디폴트는 false

 

 

GUI 프로그래밍 절차

- 메인 윈도우 생성 -> 프로그램의 틀이 되는 윈도우 생성

- 화면 구성 -> 윈도우 내부에 캔버스 또는 GUI 컴포넌트를 넣어서 사용자가 상호작용 할 수 있게 한다.

- 이벤트를 기다리다 이벤트가 발생하면 처리 -> 특정 이벤트 발생 시 호출 코드를 구현해서 등록

- 이벤트를 무한히 기다리는 반복문을 실행


GUI를 만드는 일반적인 절차

- 화면 구성

- GUI 화면 구성

//버튼 추가

import javax.swing.JButton;
import java.awt.Container;

container pane = frame.getContentpane();
JButton button = new JButton("hello");
pane.add(button)

- JPanel을 이용한 화면 구성

//JPanel 객체에 여러 컴포넌트를 추가한 후에, JFrame.getContentPane()에 JPanel 객체를 추가

JPanel panel = new JPanel();
JButton button1 = new JButton("hello 1");
JButton button1 = new JButton("hello 2");
panel.add(button1);
panel.add(button1);
Container pane = frame.getContentPane();
pane.add(panel);

-이벤트를 기다리다가 발생하면 처리

    - 스윙에는 여러 이벤트가 이미 정해져있고, 그것들을 처리하는데 필요한 인터페이스 등이 선언되어 있다.

    - 이러한 인터페이스 등을 구현한 후에 등록해야 한다.

- 버튼 클릭 처리

//ActionListener를 구현해서 등록

class ButtonListener implements ActionListener {
	public void actionPerformed(ActionEvent e){
    	System.out.println("button was clicked");
    }
}
JButton b1 = new JButton("hello");
b1.addActionListener(new ButtonListener());

- 버튼 여러 개 처리

// 버튼 여러 개 처리
import javax.swing.*;
import java.awt.event.*;
class ButtonListener implements ActionListener {
	public void createWindow() {
		JFrame f = new JFrame("Multi Buttons Window");
		b1 = new JButton("hello 1");
		b2 = new JButton("hello 2");
		JPanel p = new JPanel();
		p.add(b1);
		p.add(b2);
		b1.addActionListener(this);
		b2.addActionListener(this);
		f.getContentPane().add(p);
		f.setSize(600, 400);
		f.setVisible(true);
	}
}

- 여러 버튼 클릭 처리 

//여러 버튼 클릭 처리
import javax.swing.*;
import java.awt.event.*;
class MultiButtons implements ActionListener {
	JButton b1 = new JButton("hello 1");
	JButton b2 = new JButton("hello 2");
	public void actionPerformed(ActionEvent e) {
		JButton b = (JButton) e.getSource();
		if (b == b1) {
			System.out.println("b1 is clicked");
            }
		else if (b == b2) {
		System.out.println("b2 is clicked");
			}
	public void createWindow() {
		JFrame f = new JFrame("Multi Buttons Window");
		b1 = new JButton("hello 1");
		b2 = new JButton("hello 2");
		JPanel p = new JPanel();
		p.add(b1);
		p.add(b2);
		b1.addActionListener(this);
		b2.addActionListener(this);
		f.getContentPane().add(p);
		f.setSize(600, 400);
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	public static void main(String[] args) {
		MultiButtons m = new MultiButtons();
		m.createWindow();
	}
}

 

 

레이아웃 매니저

- BorderLayout : 미리 정의된 5개 영역에 컴포넌트 배치 

BorderLayout

- BoxLayout : 컴포넌트들을 행(row) 또는 열(column)에 배치

BoxLayout 

- FlowLayout : 컴포넌트를 한 줄에 배치한다. 만약 공간이 부족하면 다음줄로 줄바꿈하여 배치한다.

FlowLayout

- GridLayout : 같은 크기의 컴포넌트들을 행과 열을 맞춰 배치해야 할 때 많이 사용된다. 격자 모양의 그리드를 생성하고, 원하는 행과 열에 컴포넌트를 추가 가능하다.

 

GridLayout 

-위치, 크기

    - 레이아웃 매니저를 사용할 경우 폰트, 룩 앤 필에 따라서 크기를 정확하게 정의하기 어렵다.

    - 컴포넌트의 setMinimumSize(), setMaximumSize(), setPreferredSize() 함수 등을 이용해서 크기를 지정하고 JFrame.pack()하면 윈도우 크기를 컴포넌트 요소에 적절하 게 맞춤

   - 레이아웃 매니저에 따라 세 가지 함수 모두 동작하거나 일부만 동작하는 경우가 있다.

import javax.swing.*;
import java.awt.Dimension;
class LayoutDemo {
	public static void main(String[] args) {
		JFrame f = new JFrame("Window");
		JButton b1 = new JButton("hello 1");
		b1.setPreferredSize(new Dimension(1000, 100));
		b1.setMinimumSize(new Dimension(600, 100));
		b1.setMaximumSize(new Dimension(1200, 100));
		JButton b2 = new JButton("hello 2");
		b2.setPreferredSize(new Dimension(1000, 100));
		b2.setMinimumSize(new Dimension(600, 100));
		b2.setMaximumSize(new Dimension(1200, 100));
		JPanel p = new JPanel();
		p.setPreferredSize(new Dimension(1000, 300));
		p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
		p.add(b1); p.add(b2);
		f.getContentPane().add(p);
		f.pack();
		f.setVisible(true);
	}
}

- JTextField 컴포넌트 : 한 줄(single line) 문장을 편집할 수 있는 컴포넌트

//검색 대화상자 등에서 사용

import javax.swing.*;

JFrame f = new JFrame("Window");
JTextField tf = new JTextField();
f.setContentPane(tf);
f.setSize(600, 100);
f.setVisible(true);
//문자열 지정 또는 추출
void setText(String t);
String getText();

//실제 사용 예
tf.setText("새로운 문자열");
String s= tf.getText();

   

- JLabel 컴포넌트 : 문자열, 이미지 또는 둘 다 보여줄 수 있는 컴포넌트(보이는 것만 가능하고 사용자 이벤트에 반응하지 않는다.)

import javax.swing.*;

JFrame f = new JFrame("Window");
JLabel lb = new JLabel("문자열");
f.setContentPane(lb);
f.setSize(600, 100);
f.setVisible(true);

- JLabel 컴포넌트 : JLabel에 이미지를 넣으려면 imageicon 클래스 사용

import javax.swing.*;

JFrame f = new JFrame("Window");
ImageIcon img = new ImageIcon("c:/temp/italy-1280.png");
JLabel lb = new JLabel(img);
f.setContentPane(lb);
f.setSize(1280, 1050);
f.setVisible(true);
// 새로운 이미지로 지정 가능하게 해주는 함수
void setIcon(Icon icon);

//실제 사용 예시
lb.setIcon(new ImageIcon("newImage.jpg"));