Loading...

JAVA / / 2022. 2. 8. 23:14

자바 48강. paintComponent

반응형

 

코드의 가독성을 높여주고

구조를 예쁘게 만들기 위해

인터페이스 만들어줄것이다.

 

package site.metacoding.ex13;

public interface UserInterface {
	void initSetting();  // 기본 Frame 틀 지정
	void initObject();   // new 하기위한 메서드
	void initAssign();   // 화면에 추가하여 정렬하는 메서드
	void initListener(); // 리스너 메서드
}

 

이클립스에서 추상 메서드 자동 완성은

마우스만 갖다대서 바로

Add unimplemented methods를 클릭하면 된다.

 

package site.metacoding.ex13;

import javax.swing.JFrame;

public class EventEx02 extends JFrame implements UserInterface{

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

	@Override
	public void initSetting() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void initObject() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void initAssign() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void initListener() {
		// TODO Auto-generated method stub
		
	}

}

 

 

 

package site.metacoding.ex13;

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

class MyPanel extends JPanel {
}

public class EventEx02 extends JFrame implements UserInterface {
	
	MyPanel myPanel;
	JLabel labelText;
	JButton btn1;
	
	public EventEx02() {
		initSetting();
		initObject();
		initAssign();
		initListener();
		
		setVisible(true);i
	}

	@Override
	public void initSetting() {
		setSize(300, 300);
		setLocationRelativeTo(null);	// 프레임 화면 중앙 배치
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	 // 닫기버튼 클릭시 main 종료
	}

	@Override
	public void initObject() {
		myPanel = new MyPanel();
		labelText = new JLabel("첫글자");
		btn1 = new JButton("글자변경");
	}

	@Override
	public void initAssign() {
		getContentPane().add(myPanel);	// JFrame에 Panel하나 add
		myPanel.add(labelText);			// getContentPane().add와 같은 것
		myPanel.add(btn1);
	}

	@Override
	public void initListener() {
		btn1.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				labelText.setText("두번째글자"); // setText 메서드는 내부에 paintComponent를 재호출해준다!!
			}
		});
	}

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

}

 

글자변경 버튼을 누르면

labelText가 바뀌며

버튼이 살짝 뒤로 밀려난다.

 

paintComponent는

F5(새로고침)인것과 같다.

 

눈에보이기는 밀려난 것 같지만

다시 그려진것이다.

 

 

붓을 가지고 화면에 그림을 그려보자.

paintComponent 메서드

package site.metacoding.ex13;

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

class MyPanel extends JPanel {

	int x = 100;
	int y = 200;

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		System.out.println("패널 다시 그려짐");
		// Panel에 그림이 다시 그려질 때마다 paintComponent가 호출되는 것
		g.drawLine(10, 20, x, y);
	}
}

public class EventEx02 extends JFrame implements UserInterface {

	MyPanel myPanel;
	JLabel labelText;
	JButton btn1, btn2; // 200, 300으로 변경

	public EventEx02() {
		initSetting();
		initObject();
		initAssign();
		initListener();

		setVisible(true);
	}

	@Override
	public void initSetting() {
		setSize(500, 500);
		setLocationRelativeTo(null); // 프레임 화면 중앙 배치
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 닫기버튼 클릭시 main 종료
	}

	@Override
	public void initObject() {
		myPanel = new MyPanel();
		labelText = new JLabel("첫글자");
		btn1 = new JButton("글자변경");
		btn2 = new JButton("그림변경");
	}

	@Override
	public void initAssign() {
		add(myPanel); // JFrame에 Panel 하나 add
		myPanel.add(labelText); // getContentPane().add와 같은 것
		myPanel.add(btn1);
		myPanel.add(btn2);
	}

	@Override
	public void initListener() {
		btn1.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// setText 메서드는 부분 변경!!
				// 화면을 새로고침 하려면 다른 방법을 사용해야함
				// 어떤 메서드를 썼을 때 부분 변경인지 전체 변경인지 다 다름 !!!
				labelText.setText("두번째글자"); // setText 메서드는 내부에 paintComponent를 재호출해준다.
			}
		});

		// MyPanel 전체 새로고침
		btn2.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				myPanel.x = myPanel.x + 30;
				myPanel.y = myPanel.y + 30; // 실제로 값은 바뀜 ! 그림만 바뀌지 않은 상태 !!

				System.out.println(myPanel.x);
				System.out.println(myPanel.y);

				// repaint(); // this. 가 생략된것. 즉, MyFrame이 repaint
				myPanel.repaint(); // myPanel만 repaint
			}
		});
	}

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

	}

}

 

그림변경 버튼을 누를 수록 그림이 다시 그려진다.

 

이때 선의 y값이 바뀌는 이벤트가 발생할 때마다

반드시 repaint 메서드로

그림을 다시 그려주어야 한다.

 

 

 

 

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

 

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형