2011-09-06 5 views
0

Gui에 관해 몇 가지 질문을하고 싶습니다. Gui 및 Listeners 이해하기

나는 다음과 같은 예를 보았다 :

public class ShellWithButton { 
    public static void main(String[] args) { 
    Display display = Display.getDefault(); 
    Shell shell = newShell (display); 
    Button ok = newButton (shell, SWT.PUSH); 
    ok.setText ("Push Me!"); 
    ok.addSelectionListener(new ButtonHandler()); 
    ok.setLocation(0,0); 
    ok.setSize(100,30); 
    shell.pack(); 
    shell.open(); 
    while(!shell.isDisposed()) { 
    if(!display.readAndDispatch()) 
     display.sleep(); 
      } 
     display.dispose(); 
     } 
    }  

public class ButtonHandler 
implements SelectionListener { 
    public void widgetSelected(SelectionEvent e) { 
     if(e.getSource() instanceofButton) { 
      Button b = (Button) e.getSource(); 
      b.setText("Thanks!"); 
     } 
    } 
public voidwidgetDefaultSelected(SelectionEvent e){ 
// TODO Auto-generated method stub 
    } 
} 

(I) - 누군가가 버튼 - 어떻게 프로그램이 widgetSelected을 활성화 알고 있나요 밀어? 단추가 ButtonHandler 수신기를 자체에 추가했음을 알 수 있지만 왜 단추를 누르고 상자를 클릭하는 것만으로 이벤트를 ButtonHandler에 전송할 수 있습니까? 푸시가이 수신기로 전송 된 곳을 볼 수 없습니다.

(ii) - ButtonHandler의 인스턴스를 리스너에 보내려면 어떻게해야합니까? 그게 무슨 뜻 이죠?

(iii) - 버튼을 누르면 어떻게됩니까? 이 사건은 무엇입니까? 이벤트는 버튼 자체의 인스턴스입니까?

(iv) - Button b = (Button) e.getSource(); 왜 소스를 전송해야합니까? 작성된 이벤트는 버튼의 인스턴스 인 ok에서만 올 수 있습니다.

(v) - 원래 버튼의 제목이 변경되는 이유는 무엇입니까? B를 변경합니다.

대단히 감사합니다!

답변

2
  1. 는 버튼을 widgetSelected() 를 호출; 메소드를 호출해야합니다. 그러면 뭔가 할 수 있고 그 메소드에 정착하게됩니다. 전화가 당신 클래스에 전화했기 때문에 widgetSelected()이라고 부르는 이유가 있습니다. 버튼에는 SelectionListener을 구현했으며 widgetSelected() 메서드를 구현해야하므로 클래스에 widgetSelected() 메서드가 있다는 것을 알고 있습니다. 그것이 바로 인터페이스의 이유입니다. 그리고 나는 당신이 그것들을 읽을 것을 제안합니다. 단추를 클릭하기 만하면 단추를 클릭 할 때 단추 만 알기 때문에 단추를 메서드를 호출 할 수 있습니다. 화면에 클릭이 있으면 그것에 대해 알아야 할위젯 만 알려줍니다.

  2. 위에서 언급했듯이 은 버튼을 눌렀을 때 수행 할 작업을 알고 있으므로 버튼에 처리기를 보냅니다. 버튼을 누르면

  3. , 그것은 무슨 일이 있었는지 핸들러에게있다, 그래서 모든 관련 정보는 SelectionEvent 당신에게 주어집니다. 이벤트 자체는 버튼이 아니지만 이벤트는 동일한 핸들러가 둘 이상의 버튼을 처리하도록하려는 경우에 대비하여 어떤 버튼이 눌러 졌는지 알려줍니다. 뭔가 GUI 객체뿐만 아니라 버튼의 모든 종류에 일어날 때 당신의 widgetSelected() 방법이 를 호출 할 수 있기 때문에

  4. 당신은 캐스트가 필요합니다. 따라서 소스는 메소드를 호출 할 수있는 모든 위젯에 수퍼 클래스 공통 인 으로 주어지며 버튼이라고 확신 할 때 을 버튼으로 다시 캐스팅해야합니다. 예,이 프로그램에서는 버튼으로 만 호출 할 수 있지만 항상 사례는 아닙니다.

  5. B와 만든 단추가 같은 개체이기 때문에 단추의 텍스트가 변경됩니다. 자바의 객체 (및 배열)는 "포인터"이며 객체가 어디에 있는지 알려줍니다. 하나의 객체를 다른 변수에 할당하면 객체를 복사하지 않고 다른 변수를 사용하여 같은 객체를 가리 킵니다.

2

(i)는GUI 일반적으로 하나 이상의 객체가 이벤트에 가입하는 observer pattern를 사용하고,이 이벤트가 발생할 때마다 그냥 버튼의 경우처럼, 모든 등록 된 객체에 보낼 수있다.

(ii)는당신은 그들을 연결하기 위해 리스너에 인스턴스를 보내, 그래서 적절한 때 그들은 이벤트를받을 수 있습니다.

(Ⅲ)는 무슨 일 이벤트가 결국 몇 가지 코드가 실행되기로 연결하여 버튼을 누르면 한 알림을받을 관찰자를 일으키는 것입니다. 이벤트 자체는 버튼의 인스턴스가 아니라 이벤트를 처리하는 별도의 인스턴스입니다.

(IV)당신은이 사건의 여러 종류를 위해 사용되기 때문에 메서드 서명, 그냥 일반적이기 때문에, 그것을 캐스팅해야합니다. 버튼을 누르면 한 이벤트가 일어 났을 때 당신의 버튼을 통보하고이 경우 관찰자 패턴, 관찰자를 사용하기 때문에

는 (V)그것은, 제목을 변경했습니다.

+0

감사합니다. oscar. 이 리스너는 항상 버튼 자체와 관련이 있습니까? 쉘에서 텍스트를 변경하려고한다고 가정 해 봅시다. 단추에이 수신기를 추가해야합니까? 아니면 셸에 추가 할 수 있습니까? – Numerator

+0

@Nir 예이 청취자는,이 버튼이이 이벤트에 등록되어있는 한, 이벤트를 버튼에 발송합니다. Shell 클래스가 무엇인지 모르겠지만 텍스트를 변경하려면 이벤트가 발생할 때 변경하려면 텍스트를 리스너로 추가해야합니다. –

2

(i) "Listeners"의 기본 개념은 이벤트에 대한 알림을받을 구성 요소, 객체, 소프트웨어 모듈 등의 목록을 제공하려는 것입니다. 버튼 클릭이 단순히 무언가를 유발하지 않는 이유는 무언가가 그것에 반응하기 위해 해당 이벤트를 듣고 있어야하기 때문입니다. 적절한 Listener 인터페이스를 구현하는 모든 객체 (이벤트 유형에 따라 다름)를 추가 할 수 있으므로 이벤트를 처리 할 수 ​​있습니다.

(ii) 콜백입니다. 리스너에게 "이벤트를 처리 할 수있는 오브젝트의 인스턴스가 있습니다. 통지 할 오브젝트 목록에 추가하십시오."어떤 의미에서 RSS 피드에 가입하는 것과 비슷합니다. 목록에있는 모든 사람들이 업데이트를받습니다.

(iii) 이벤트는 별도의 개체입니다. , 기본 OS의 윈도우 라이브러리에 연결) 이벤트 오브젝트를 작성한 다음 등록 된 리스너 목록을 내려서 각각에 통지합니다 (예 : 리스너가 이벤트를 흡수 할 수 있음). 목록에있는 다른 사람이 청취하는 것을 방지하지만 자체적 인 질문입니다.

(iv) getSource()는 구성 요소의 인스턴스를 반환하기 때문에 Button 관련 정보에 액세스 할 수 있습니다. 메소드 (다음 행에서 수행되며 setText을 사용하면 무엇을 해야할지를 알기 위해 해당 메소드 호출에 대한 Button의 인스턴스를 처리해야합니다 (예 : 어떤 클래스가 작동하는지).

(v) 버튼의 제목이 변경되지 않습니다. ButtonHandler가 변경하고 있습니다. 따라서 위젯이 선택되면 "widgetSelected"메서드가 ButtonHandler 내부에서 호출됩니다. 그런 다음 이벤트 원본 (원본 단추에 대한 참조를 제공)을 확인한 다음 단추의 텍스트를 클릭하여 업데이트합니다. 누군가가 버튼을 밀어하면 그 라이브러리가 디자인 된 방법이기 때문에