문제

좋아, 그래서 내가 추가하면 ActionListener GUI 요소에 요소 나는 그것을 사용합니다 ActionListener 다음 줄 중 어느 줄 (A, B)이 확인란을 선택한 상태를 가져 오는 데 사용하는 것이 중요합니까?

final JCheckBox checkbox = (JCheckBox)this.buildResult.get("cbDebugTick");
checkbox.addActionListener(new ActionListener() {
    @Override public void actionPerformed(ActionEvent event){               
            boolean bChecked =
            // (a) checkbox.isSelected();
            // (b) ((JCheckBox)event.getSource()).isSelected();
            model.setPrintDebugOn(bChecked);
        }
});

내가 추가하면 ActionListener 여러 GUI 요소에 물체를 사용하면 (B)를 사용해야합니다.

그리고 (b)에서 맹목적으로 캐스팅해도 괜찮습니까? event.getSource() 에게 JCheckBox, 나는 액션 리스너를 추가 한 사람이기 때문에, 또는 방어 적으로 프로그램하고 instanceof 확인하다?

노트: 이 질문은 일반적으로 이벤트 청취자의 맥락에 있습니다. KDGREGRY는 특별히 Re : 내가 고려한 체크 박스 아래에 몇 가지 좋은 점이 있습니다.

도움이 되었습니까?

해결책

(b)에서 엄격하기 위해서는 실제로 점검을 수행해야하지만 그렇게 중요하지는 않습니다. 나는이 두 줄이 모두 괜찮고 수용 가능하다고 생각하지만 (b) "더 나은 코드"가 될 것입니다.

그러나 일반적으로 액션 리스너에서 수행되는 것은 단순히 확인란에 사용자 정의 된 다른 메소드를 호출하는 것입니다. 그래서 그것은 다음과 같이 보일 것입니다.

 @Override public void actionPerformed(ActionEvent event) {                                  
    //your treatment would be in this method, where it would be acceptable to use (a)                  
    onCheckBoxActionPerformed(event)
}

다른 팁

나는 둘 다하지 않을 것이다.

확인란을 클릭하면 조치가 시작되면 ItemListener, 그 다음에서 선택 상태를보십시오. itemEvent.

그러나 확인란은 일반적으로 작업을 호출하지 않으며 상태를 관리합니다. 따라서 더 나은 접근 방식은 작업을 시작하는 모든 것에 대한 응답으로 모든 확인란을 검사하는 것입니다.


편집 : OP가 제기 한 더 큰 문제에 대한 논평.

첫째, 스윙의 많은 부분이 일관된 동작 모델보다는 구현 편의성을 나타내는 것이 중요합니다. jcheckbox 그리고 Jbutton 공간 내에서 클릭하는 것이 의미가 있다는 사실 외에는 공통점이 없습니다. 그러나 그들은 둘 다 상속합니다 AbstractButton, 버튼의 레이블과 같은 구현 세부 사항을 제공합니다. 또한 버튼이 "누르고"버튼을 누르면 의미있는 동작 (동작)이 시작됩니다. 그러나 jcheckbox의 경우 버튼 프레스가 중요하지 않으며 상태 변경은 중요합니다. 이 상태 변경은 항목 리스너에게 신호를 보내고 있습니다. 이는 상태 변경이 다른 버튼 유형에 의미가 없더라도 AbstractButton에 정의됩니다 (Javadoc은 "확인란"이라고도 함).

스윙이 제대로 된 것 중 하나는 사용하기 어렵다면 동작 해당 조치를 시작하는 제어와 분리되어 있습니다. 메뉴 항목, 대화 상자의 푸시 버튼, 키 스트로크 등 여러 컨트롤에서 액션 객체를 호출 할 수 있습니다. 디자인 관점에서 더 중요한 것은 그것이 어떤 일이 필요한지 알아 내려는 일반적인 "청취자"라는 아이디어에서 멀어지게한다는 것입니다. 예를 들어 단일 리스너가 전체 메뉴 시스템에서 입력을 수신 한 다음 큰 IF/Else 체인을 통해 실행하여 어떤 메뉴 항목을 누르는 지 앱을 보았습니다. 액션을 사용하면 더 많은 클래스가 있지만 장기적으로는 더 관리 가능한 앱을 제공합니다.

마지막으로, 유용성 관점에서, Jcheckbox 및 JtextArea와 같은 상태를 유지하는 컨트롤과 Jbutton 및 Jmenuitem과 같은 행동을 시작하는 컨트롤 사이에는 차이가 있습니다. 라디오 버튼을 클릭하면 다른 페이지로 이동하는 (웹) 앱을 보았습니다. 그 나쁜. 내부적으로 청취자를 사용하여 일부 모델의 상태를 업데이트 할 계획이더라도 GUI 요소 컬렉션이 모델을 제공하지 않는 이유를 스스로에게 물어봐야합니다.

청취자가 독점적 인 경우 (예 : 아논 리스너)의 경우 (a)를 사용합니다.

청취자가 재사용되면 (예 : this ActionListener의 인스턴스입니다.)

@Override
public void actionPerformed(ActionEvent event) {
    Object src = event.getSource();
    if (src == checkbox) {
        boolean bChecked = checkbox.isSelected();
        // ...
    }
}

여러 확인란이 있고 같은 방식으로 처리 된 경우 instanceof 말이된다.

B를 모범 사례 옵션이므로 B를 방어 적으로 프로그램했습니다. 그러나 만약 당신만이 코드를 사용한다면, 당신이 할 수없는 이유는 없습니다. 그러나 미래의 시점에서 다시 돌아와서 무언가를 바꾸고 직접 재사용 할 수있는 좋은 코드를 썼다면 얼마나 행복 할 것인지 상상해보십시오 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top