반응형
코드의 가독성을 높여주고
구조를 예쁘게 만들기 위해
인터페이스 만들어줄것이다.
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
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9
반응형