๐Ÿ–ผ๏ธ ๊ฐค๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ธฐ ์˜ˆ์ œ๋กœ ๊ทธ๋ž˜ํ”ฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝํ—˜ํ•˜๊ธฐ

heeezniยท2025๋…„ 5์›” 21์ผ

Java GUI ํ”„๋กœ์ ํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
6/20
post-thumbnail

๊ทธ๋ž˜ํ”ฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋น„์œ 

ํ˜„์‹ค ์„ธ๊ณ„๊ทธ๋ž˜ํ”ฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์„ค๋ช…
1) ํ™”๊ฐ€์ปดํฌ๋„ŒํŠธ (Canvas, Panel ๋“ฑ)์Šค์Šค๋กœ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด
2) ๊ทธ๋ฆฌ๋Š” ํ–‰์œ„์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง„ ๋ฉ”์„œ๋“œ (paint())๊ทธ๋ฆฌ๊ธฐ ๋™์ž‘
3) ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๋Š” ๋„๊ตฌ
(ํŒ”๋ ˆํŠธ ๋“ฑ)
Graphics ๊ฐ์ฒด (Graphics g)๊ทธ๋ฆฌ๊ธฐ ๋„๊ตฌ, ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋จ
4) ๊ทธ๋ ค์งˆ ๋Œ€์ƒ
(์บ”๋ฒ„์Šค)
์ปดํฌ๋„ŒํŠธ ์ž์‹  (this)๊ทธ๋ฆผ์ด ์ถœ๋ ฅ๋  ๋Œ€์ƒ

โœ… ์ฒดํฌํฌ์ธํŠธ

  • ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” ์‹คํ–‰ ์‹œ ์Šค์Šค๋กœ๋ฅผ ๊ทธ๋ฆผ

  • ์ด ์ž‘์—…์€ ๋‚ด๋ถ€์ ์œผ๋กœ paint(Graphics g)
    ๋˜๋Š” paintComponent(Graphics g)์—์„œ ์ฒ˜๋ฆฌ๋จ.

  • ์šฐ๋ฆฌ๊ฐ€ โญpaintComponent()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉโญํ•˜๋ฉด,
    ๊ธฐ๋ณธ ๊ทธ๋ฆผ์„ โ€œ๊ฐ€๋กœ์ฑ„๊ณ โ€ ์ƒˆ๋กญ๊ฒŒ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์Œ.

  • ์ด๋•Œ, Graphics๋Š” ๋ถ“์ด์ž ํŒ”๋ ˆํŠธ์ด๊ณ , ์ปดํฌ๋„ŒํŠธ ์ž์‹ ์€ ๊ทธ๋ ค์ง€๋Š” ๋Œ€์ƒ.

Swing์—์„œ๋Š” paintComponent() ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๊ถŒ์žฅ

Swing์—์„œ๋Š” paint()๋ฅผ ์ง์ ‘ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋Š” ๊ฑด ๊ถŒ์žฅ๋˜์ง€ ์•Š์Œ
โ†’ paintComponent()๋งŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋ผ๊ณ  ๊ณต์‹ ๋ฌธ์„œ์—๋„ ๋ช…์‹œ

์ด์œ : paint()๋Š” ์ „์ฒด๋ฅผ ๋‹ค ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ผ ์œ„ํ—˜ํ•จ

//Swing ์ปดํฌ๋„ŒํŠธ์˜ paint() ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ
protected void paint(Graphics g) {
    paintComponent(g);  // ๐Ÿ”ฅ ๋ณธ๋ฌธ(๋ฐฐ๊ฒฝ, ํ…์ŠคํŠธ ๋“ฑ)
    paintBorder(g);     // ํ…Œ๋‘๋ฆฌ
    paintChildren(g);   // ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค
}

์˜ค๋ฒ„๋ผ์ด๋”ฉ ์‹œ super.paintComponent(g);ํ˜ธ์ถœ ํ›„ ์ปค์Šคํ…€ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ
(๋ถ€๋ชจ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)


repaint( )

"์ปดํฌ๋„ŒํŠธ ๋‹ค์‹œ ๊ทธ๋ ค์ค˜~(์š”์ฒญ)"

๊ทธ๋ž˜ํ”ฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ปดํฌ๋„ŒํŠธ์— ์•ฝ๊ฐ„์˜ ๋ณ€ํ™”๋ผ๋„ ์ƒ๊ธฐ๋ฉด,
๊ธฐ์กด์— ๊ทธ๋ ค์ง„ ๊ทธ๋ฆผ์€ ๋ฌดํšจํ™”๋˜๊ณ , ๋‹ค์‹œ ๊ทธ๋ ค์ ธ์•ผ ํ•จ.
์ด ๊ณผ์ •์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ,
JVM๊ณผ OS(Graphics ์‹œ์Šคํ…œ)๊ฐ€ ์ž๋™์œผ๋กœ ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰

์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ์‚ฌ์ด์ฆˆํ•˜๊ฑฐ๋‚˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ:
repaint();๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜ธ์ถœํ•˜๋ฉด
์‹œ์Šคํ…œ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์•„๋ž˜ ๊ณผ์ •์„ ์ž๋™ ์ˆ˜ํ–‰

๐ŸŽจ AWT์˜ ๊ทธ๋ฆฌ๊ธฐ ํ๋ฆ„ (๊นœ๋นก์ž„ ์žˆ์Œ)

repaint()
โ†“
update(Graphics g)
โ†“ (๋ฐฐ๊ฒฝ clearRect() ๋“ฑ์œผ๋กœ ์ง€์›€)
paint(Graphics g)
โ†“
[์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ทธ๋ฆผ]

๐Ÿ–ผ๏ธ Swing์˜ ๊ทธ๋ฆฌ๊ธฐ ํ๋ฆ„ (์ด์ค‘ ๋ฒ„ํผ๋ง, ๊นœ๋นก์ž„ ์—†์Œ)

repaint()
โ†“
update(Graphics g)
โ†“ (๋ฐฐ๊ฒฝ ์•ˆ ์ง€์›€ โ†’ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์œผ๋กœ ๋ฐ”๋กœ paint ํ˜ธ์ถœ)
paint(Graphics g)
โ†“
paintComponent(Graphics g)

  • paintComponent(g) โ† ๐Ÿ”ฅ ์‚ฌ์šฉ์ž ์ปค์Šคํ…€ ๊ทธ๋ฆผ ์—ฌ๊ธฐ์— ์ž‘์„ฑ
  • paintBorder(g)
  • paintChildren(g)
    โ†“
    [์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ทธ๋ฆผ]

โš ๏ธ paint()๋Š” ์ ˆ๋Œ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ ๋จ!
โ†’ ์‹œ์Šคํ…œ์ด ํ˜ธ์ถœํ•ด์ค˜์•ผ ์ •ํ•ด์ง„ ํ๋ฆ„๋Œ€๋กœ ๋™์ž‘ํ•จ


Toolkit์„ ์ด์šฉํ•œ ์ด๋ฏธ์ง€ ๋กœ๋”ฉ โญ

Toolkit : ์ด๋ฏธ์ง€ ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•  ๋•Œ, ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๊ฐ€์ ธ์˜ค๋Š” ๋„๊ตฌ ํด๋ž˜์Šค

Toolkit kit = Toolkit.getDefaultToolkit();
Image img = kit.getImage("์ด๋ฏธ์ง€ ๊ฒฝ๋กœ");

๊ฐค๋Ÿฌ๋ฆฌ ์˜ˆ์ œ์—์„œ๋Š”...์ด๋ฏธ์ง€ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋กœ ๋ฐฐ์—ด์— ๋„ฃ์–ด๋ฒ„๋ฆผ

Toolkit kit = Toolkit.getDefaultToolkit();
Image[] imgArray = new Image[9];
imgArray[i] = kit.getImage("์ด๋ฏธ์ง€ ๊ฒฝ๋กœ");

//์ด ์ค‘๊ฐ„๋ณ€์ˆ˜ ์ƒ๋žตํ•œ ๊ฑฐ์ž„
Image img = kit.getImage("๊ฒฝ๋กœ"); //์ด๋ฏธ์ง€ ๊ฐ์ฒด ๋งŒ๋“ค๊ณ 
imgArray[i] = img; //์ด๋ฏธ์ง€ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด์— ๋„ฃ๊ณ 

์œˆ๋„์šฐ์ฐฝ ๋‹ซ์„ ๋•Œ, ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ์‹œํ‚ค๊ธฐ

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JFrame ์ฐฝ์„ ๋‹ซ์„ ๋•Œ ํ”„๋กœ๊ทธ๋žจ(ํ”„๋กœ์„ธ์Šค)๋„ ํ•จ๊ป˜ ์ข…๋ฃŒ๋˜๋„๋ก ์„ค์ •ํ•˜๋Š” ์ฝ”๋“œ


๊ฐค๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ธฐ

์ด์ „/๋‹ค์Œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์‚ฌ์ง„์ด ๋„˜์–ด๊ฐ€๊ณ 
Label์—๋Š” ํŒŒ์ผ๋ช…์ด ๋‚˜์˜ค๊ฒŒ ๊ตฌํ˜„ํ•ด๋ด„!

package gui.graphic;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Gallery extends JFrame implements ActionListener {
	JPanel p_north;
	JButton bt_prev, bt_next;
	FilenameLabel la_title;

	Toolkit kit; //โœ… ์‹œ์Šคํ…œ์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ฐœ๋ฐœ์ž ๋Œ€์‹  ์–ป์–ด๋‹ค ์ฃผ๋Š” ๊ฐ์ฒด
	MyCanvas myCanvas;
	//์ด๋ฏธ์ง€ ๊ฐ์ฒด๋ฅผ ๋ชจ์•„๋†“์„ ๋ฐฐ์—ด ์ค€๋น„ (โš  ํฌ๊ธฐ ๋ช…์‹œ ํ•„์ˆ˜!)
	Image[] imgArray = new Image[9];

	String[] path = new String[] {
		"animal1.jpg",
		"animal2.jpg",
		"animal3.jpg",
		"animal4.jpg",
		"animal5.jpg",
		"animal6.jpg",
		"animal7.jpg",
		"animal8.jpg",
		"animal9.jpg"
	};

	int index = 0;

	public Gallery() {
		p_north = new JPanel();
		bt_prev = new JButton("์ด์ „");
		la_title = new FilenameLabel(path[index]);
		bt_next = new JButton("๋‹ค์Œ");

		kit = Toolkit.getDefaultToolkit(); //โœ… ํˆด ํ‚ท์˜ ์ธ์Šคํ„ด์Šค ์–ป๊ธฐ
		myCanvas = new MyCanvas();

		p_north.add(bt_prev);
		p_north.add(la_title);
		p_north.add(bt_next);
		p_north.setPreferredSize(new Dimension(600, 50));

		add(p_north, BorderLayout.NORTH);
		add(myCanvas);
        
		//์ดˆ๊ธฐ ์ด๋ฏธ์ง€ ์ค€๋น„ ๋ฐ ์ ์šฉ
		createImg();
		myCanvas.setImg(imgArray[index]);

		bt_prev.addActionListener(this);
		bt_next.addActionListener(this);

		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(600, 500);
		setVisible(true);
	}
	//โœ… ์ด๋ฏธ์ง€ ๋ฐฐ์—ด์— ์ด๋ฏธ์ง€ ๊ฐ์ฒด 9๊ฐœ๋ฅผ ์ค€๋น„
	public void createImg() {
		for (int i = 0; i < path.length; i++) {
			imgArray[i] = kit.getImage("C:/.../res/geographic/" + path[i]);
		}
	}

	public void showImg(int n) {
		index += n;

		if (index >= imgArray.length) {
			index = 0;
		} else if (index < 0) {
			index = imgArray.length - 1;
		}

		myCanvas.setImg(imgArray[index]);
		myCanvas.repaint(); // "ํŒจ๋„์„ ๋‹ค์‹œ ๊ทธ๋ ค์ค˜~"
		la_title.setText(path[index]);
	}
	//๋ฆฌ์Šค๋„ˆ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();

		if (obj == bt_prev) {
			showImg(-1);
		} else if (obj == bt_next) {
			showImg(1);
		}
	}

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

์–ด์ œ ์œ ํšจ์„ฑ ์ฒดํฌ์—์„œ๋Š” length( )๋ฅผ ์ผ๋˜ ๊ฒƒ ๊ฐ™์€๋ฐโ€ฆ
์˜ค๋Š˜ ๋ฐฐ์—ด์˜ ๊ธธ์ด์—๋Š” ์™œ ๊ทธ๋ƒฅlength์ง€?

  • length โ†’ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜(ํ•„๋“œ)
  • length() โ†’ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฉ”์„œ๋“œ(ํ•จ์ˆ˜)

MyCanvas ํด๋ž˜์Šค

package gui.graphic;
import javax.swing.*;
import java.awt.*;

public class MyCanvas extends JPanel {
	Image image; //ํ•„์š”ํ•˜๋ฉด ๋ณด์œ ํ•˜๊ธฐ

	public MyCanvas() {
		setBackground(Color.PINK);
		setPreferredSize(new Dimension(600, 450));
	}
	//โœ… ์ด๋ฏธ์ง€๋ฅผ ๋„˜๊ฒจ๋ฐ›์„ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜์ž (setter ์ฃผ์ž…)
	public void setImg(Image image) {
		this.image = image;
	}

	public void paint(Graphics g) {
		g.drawImage(image, 0, 0, 600, 450, this); //Jpanel ์ž์‹ ์„ ๐Ÿ‘€์ด๋ฏธ์ง€์˜ต์ €๋ฒ„๋กœ ์ง€์ •
	}
}

๐Ÿ‘€ ImageObserver

Java์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ๋Š” ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—,
์ด๋ฏธ์ง€๊ฐ€ ์•„์ง ๋‹ค ๋กœ๋“œ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๋ ค ํ•  ์ˆ˜๋„ ์žˆ์Œ

๐Ÿ‘€ ImageObserver : ์ด๋ฏธ์ง€๊ฐ€ ๋น„๋™๊ธฐ ๋กœ๋”ฉ๋˜๋Š” ์ƒํ™ฉ์—์„œ๋„,
์™„์ „ํžˆ ๋กœ๋“œ๋˜์—ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ํ™”๋ฉด์— ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฐ์‹œ์ž ์—ญํ• 

๊ฐœ๋ฐœ์ž๋Š” ์ด ์˜ต์ €๋ฒ„ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š”๋ฐ,
JPanel์€ ImageObserver ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
์ž๊ธฐ ์ž์‹ (this)์„ ์˜ต์ €๋ฒ„๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

<์ฐธ๊ณ >
JPanel, JButton, JLabel, JFrame ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ GUI ์ปดํฌ๋„ŒํŠธ๋Š” Component ์ƒ์† ๊ตฌ์กฐ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „๋ถ€ ImageObserver ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Filename ํด๋ž˜์Šค

package gui.graphic;
import javax.swing.JLabel;

public class FilenameLabel extends JLabel {

	public FilenameLabel(String filename) {
		super(filename); //JLabel์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์ƒ์„ฑ์ž ํ˜ธ์ถœ 
       					 //โ†’ ์ œ๋ชฉ ์ถœ๋ ฅ ๊ฐ€๋Šฅ
	}
}
profile
์•„์ด๋“ค์˜ ๊ฐ€๋Šฅ์„ฑ์„ ๋ฏฟ์—ˆ๋˜ ๋งˆ์Œ ๊ทธ๋Œ€๋กœ, ์ด์ œ๋Š” ๋‚˜์˜ ๊ฐ€๋Šฅ์„ฑ์„ ๋ฏฟ๊ณ  ๋‚˜์•„๊ฐ€๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€