자바 프로그래밍 수업을 들으면서 생긴 궁금증들을 정리해둘 생각이다
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class Program05 extends JFrame {
Container c = getContentPane();
public Program05() {
setTitle("Click \"C\"");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
c.setLayout(null);
c.addMouseListener(new MyMouseAdapter());
setSize(300, 300);
setVisible(true);
}
public static void main(String[] args) {
new Program05();
}
}
class MyMouseAdapter extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
JLabel label = new JLabel();
label.setSize(5,5);
int x = e.getX();
int y = e.getY();
label.setLocation(x,y);
int r = (int)(Math.random()*256);
int g = (int)(Math.random()*256);
int b = (int)(Math.random()*256);
label.setOpaque(true);
label.setBackground(new Color(r,g,b));
Container container= (Container)e.getSource();
container.add(label);
container.revalidate();//무적
container.repaint();
//동적변화 후 두 줄을 추가해야 컨테이너에 반영됨
}
}
마우스 이벤트 동작을 '독립 클래스'를 생성해 처리하는 코드이고,
MouseAdapter 클래스를 상속하고 있기 때문에 마우스 이벤트 리스터의 모든 동작을 처리할 필요는 없다.
revalidate()
컨테이너 배치관리자에게 자식컴포넌트를 재배치하도록 지시한다. 컴포넌트를 새로 생성, 혹은 수정, 삭제해 컨테이너 상태가 변화했다면, 새로운 환경을 컨테이너에 적용시켜줄 필요가 있다.
간혹 revalidate() 가 repaint를 부르는 것이 잘 처리되지 않을 수도 있기에 repaint() 도 따로 처리해준다.
repaint()
컴포넌트의 변화를 알려주고, 강제로 페인팅할 것을 지시한다.
컴포넌트가 변화되었다면, 그 전 부모 컴포넌트부터 그리는 것이 좋다.
// componentObject.getParent().repaint() ;