2013년 10월 31일 목요일

2013. 10. 31 CSS 마진겹침현상.

1. 마진겹침 현상 중 부모자식간의 마진겹침 현상 설명

- 부모 엘리먼트가 시각적 요소를 갖지 않는 경우 자식 엘리먼트와 부모 엘리먼트 중에 더 큰 마진 값에 따라 화면에 표시된다.
- 시각적 요소를 갖는 경우에는 부모 엘리먼트의 마진 값에 자식 엘리먼트의 마진 값이 더해져서 표현됨.

이유 : 마진은 컨텐츠와 구별되는 외부 경계와의 여백을 표현하는 값인데, 부모 엘리먼트가 아무런 시각적 요소를 취하지 않으면 부모 엘리먼트는 더이상 외뷔 경계가 아니다. 따라서 부모 엘리먼트가 아닌 다른 외부 엘리먼트를 고려해서 마진값이 적용됨.


2. 자기자신의 마진겹침 현상

- 시각적 요소를 갖지 않는 엘리먼트의 경우 상하 마진 값중 큰 것만 적용됨. 스스로도 마진 겹침 현상이 생기는 셈.

2013년 10월 30일 수요일

2013. 10. 30 Java Event Listener는 어떻게 Event를 받아들이나.

1. Q : 아래 코드에서 main method에 actionPerformed 메소드를 실행하는 코드가 안쓰여있는데 버튼 클릭을 하면 어떻게 버튼 클릭 Event를 인식해서 Listener안의 actionPerformed를 실행하나?  
import java.awt.*;
public class TestButton {
  public static void main(String args[]) {
    Frame f = new Frame("Test");
    Button b = new Button("Press Me");
    b.addActionListener(new ButtonHandler());
    f.add(b,BorderLayout.CENTER);
    f.pack();
    f.setVisible(true);
  }

}

class ButtonHandler implements ActionListener {
public void actionPerformed(ActionEvent e)
{
    System.out.println("Action occurred");
    System.out.println("Button's label is :”
   + e.getActionCommand());
  }
}


A : 아래 코드를 보자.
public class Button {
  private final List<ActionListener> listeners = new ArrayList<ActionListener>();

  public void addActionListener(ActionListener l) {
    listeners.add(l);
  }

  public void click() {
    ActionEvent event = new ActionEvent(this, 0, "click");
    for (ActionListener l : listeners) {
      l.actionPerformed(event);
    }
  }
}

main 함수 안에 없는 actionPerformed가 click() 메소드 안에있다. click은 Button class안에 있고  Button class는 import된 java.awt에 포함되어 있다. ButtonHandler라는 listner만 addActionListener를 통해 더해주면 실행은 awt가 알아서 하는 식. 
'아래코드'에서 마우스 클릭후 생성되는 이벤트는 모든 Listener의 actionPerformed의 파라미터에 들어가서 실행한다. 그 과정에서 새로 등록된 Listener의 actionPerformed도 실행됨.

오늘의 결론 : Listener 만들어 놓기만 하면 Java.awt가 actionPerformed는 알아서 실행시켜줌.