2013-07-11 2 views
1

그래서 일반적으로 C, C++ 및 C# 프로그래머이며 대부분의 GUI 경험이 C# WPF입니다. Java를 사용하는 프로젝트에 배치되었고 Java와 잘 어울리지 않는 C#에 대한 어휘를 찾고 있습니다.자바 작업 설명

하나의 이슈는 JButtons를 다루었으며 아마도 C#에서 '델리게이트'라고 알려진 것을 가지고 있습니다. 이 example에서 코드의이 비트가있다 : 함수가 (매개 변수로 또는 전달) 매개 변수로 정의된다

간단하게, 어떤이가 호출
jbnButton1.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     jtfInput.setText("Button 1!"); 
    } 
}); 

? 또한 이것이 최선의 방법입니까? 내가하고있는 프로젝트에서 Initialize() 함수는 단추, 체크 상자 등에 대해 이와 같은 함수로 채워져있어서 다소 비 휘발성 함수가됩니다. 나는 Initialize() 내에서 대신 클래스 레벨에서 정의하는 것을 선호한다.

다른 example (맨 위 코드 예)으로 연결됩니다. 이러한 코드 라인 : 거의

b1.addActionListener(this); 
    b3.addActionListener(this); 
... 
} 

public void actionPerformed(ActionEvent e) { 
    if ("disable".equals(e.getActionCommand())) { 
     b2.setEnabled(false); 
     b1.setEnabled(false); 
     b3.setEnabled(true); 
    } else { 
     b2.setEnabled(true); 
     b1.setEnabled(true); 
     b3.setEnabled(false); 
    } 
} 

, 코드 (외부 I 원하는 범위에 정의 된 동일한 이벤트 핸들러에 B3 버튼 하나 B1, 버튼 세 가지의 액션을 지정 어디 버튼이 초기화되고 있습니다). 다른 기능을 가리킬 수있는 방법이 있습니까? 또한 호출하여

.addActionListener(this); 

어떻게 컴파일러가 this에서 actionPerformed (ActionEvent e)를 사용합니까? 조치가 'actionPerformed (ActionEvent e)'로 해석 될 것이라고 미리 정의 된 항목이 있습니까?

+0

을 자동으로 호출합니다. 이것은 현재 ActionListener 인터페이스를 구현해야하는 클래스입니다. 컴파일러는 actionPerformed를 사용하도록 "파악하지"않습니다. 대신 addActionListener는 매개 변수가 actionPerformed() 메소드를 포함하는 ActionListener 인터페이스를 구현해야합니다. ActionEvent.getSource()를 사용하여 b1 또는 b3을 클릭했는지 확인한 다음 actionPerformed 메서드에서 적절한 메서드를 호출합니다. – DwB

답변

1

첫 번째 예는 익명 클래스입니다. 리스너 (예 : ActionListener)와 같이 자주 사용되지만 저장된 참조가 없으므로 리스너를 제거하지 않아도되는 경우에만 사용해야합니다.

질문의 두 번째 부분에 대해서는 컴파일러에서 actionPerformed을 호출 할시기를 알 수 없습니다.ActionListenerdocumentation에 선언 :

액션 이벤트가 발생

는 해당 객체의 actionPerformed 메소드가 호출됩니다.

따라서, 조치가 발생할 때마다 여기에 추가 된 모든 ActionListener들에 actionPerformed를 호출 할 JButton의 책임입니다.

b1b3을 다른 방법으로 가리키는 방법은 없습니다. b1이 lable가 "사용 안 함"을 가지고 가정

b1.addActionListener(new ActionListener() 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     b2.setEnabled(false); 
     b1.setEnabled(false); 
     b3.setEnabled(true); 
    } 
}); 

b3.addActionListener(new ActionListener() 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     b2.setEnabled(true); 
     b1.setEnabled(true); 
     b3.setEnabled(false); 
    } 
}); 

이 익명 클래스는 더 나은 디자인을 위해 만들 것 곳의 좋은 예입니다. 그런 다음 this은 더 이상 ActionListener을 구현할 필요가 없습니다. 두 번째 코드 예를 들어

1

첫 번째 예제는 "익명 내부 클래스"라고합니다. ActionListener의 익명 하위 클래스를 정의하고 actionPerformed 메서드를 재정의하고 인스턴스화 (이 하위 클래스의 인스턴스 만들기) 한 다음 해당 인스턴스에 대한 참조를 jbnButton1.addActionListener 메서드에 전달합니다. 이것은 가장 가까운 Java가 "closure"를 가지고있는 것입니다 (최소한 Java 8까지). 액션 청취자가 간단 할 때

이 관용적이지만

class MyListener extends ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     jtfInput.setText("Button 1!"); 
    } 
} 
... 
jbnButton1.addActionListener(new MyListener()); 

으로이 문제를 코딩 할 수 있지만 다음에 동의하고 jtfInput 참조를 저장 MyListener에 대한 생성자를 준비해야 할 수도 있습니다. 인라인 정의는 이것을 단순화합니다. 그러나 좀 더 복잡한 상황에서는 클래스를 라인 밖에서 정의하고 싶을 수도 있습니다. 두 번째 질문에 관해서는

:

.addActionListener(this); 

이 그것이 actionPerformed() 방법이 있어야합니다, 그래서 ActionListener 인터페이스를 구현해야합니다 나타나는 클래스입니다. 그것이 프레임 워크가 호출 할 내용을 "알 수있게"합니다.

1

:

그것은 당신이 버튼에 actionlistener -s를 추가하기 위해 사용하는 클래스가 인터페이스를 ActionListener

을 구현하기 때문에 actionperformed() 것을 사용하는 것이 알고

당신은 addActionListener 방법으로 전달하는 경우 그것은이 addActionListener 방법은 알고 ActionListener

때문에 당신이 actionPerformed 방법을 구현해야합니다 자신의 클래스 (이), 그것은 단지 anonymous classes로 작동 그것은 actionPerformed 메서드를 가지고 있기 때문에 (그것은 하나 여야합니다), 두 번째 질문에 대해