스윙 : 사용자가 원인 항목과 응용 프로그램이 사용하는 항목을 구별 할 수있는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/176150

문제

스윙 기반 애플리케이션에서 Combobox와 함께 일하고 있으며 사용자 이벤트에서 생성 된 항목 vs와 응용 프로그램으로 인한 항목을 구별하기 위해 무엇을 해야하는지 알아내는 데 어려움을 겪고 있습니다.

예를 들어, 콤보 박스가 있다고 가정 해 봅시다. 'combo'그리고 나는 ItemListener와 함께 ItemStateChanged 이벤트를 듣고 있습니다.'listener'. 사용자가 선택을 항목 2로 변경하거나 선 (pseudocode)을 실행할 때 :

combo.setSelection(2)

..이 사건들을 구별 할 수없는 것 같습니다.

즉, 나는 어떤 방법 으로든 스윙 전문가가 아니기 때문에 물어볼 것이라고 생각했습니다.

감사!

도움이 되었습니까?

해결책

행동과 반응 법은 분명합니다 :). 변화에 반응하려고하면 사용자와 응용 프로그램을 구별 할 필요가 없습니다. 나는 당신이 "구별"해야하는 하나의 유스 케이스 만 상상할 수 있습니다. 응용 프로그램이 일부 데이터를 표시하는 경우. 이 경우 응용 프로그램의 데이터 모델이있을 수 있습니다. 또한이 모델에는 일부 변경 리스너가 있으며 응용 프로그램 GUI는 값을 구성 요소로 설정하여 반응합니다. 그리고 또한. 사용자가 GUI 구성 요소로 무엇이든 선택한 경우 데이터 모델은 값을 변경하여 반응합니다. 이 경우 데이터 모델에서 일종의 읽기 전용 상태를 쉽게 설정할 수 있으며, 이는 관찰 된 객체에서 나오는 모든 이벤트를 무시하도록 모델에 알릴 수 있습니다. 이 알림 세트는 EDT에서 실행해야하며 플래그에 아무런 문제가 없습니다. Small example:

class ApplicationDataModel {

    private Flag current = Flag.RW;

    public void setData(ApplicationData data) {
        current = Flag.RO;
        setDataImpl(data);
        notifyObservers();
        current = Flag.RW;
    }

    public void reaction(Event e) {
        if (flag = Flag.RO) return;
        ...
    }

}

플래그에주의를 기울이고 스레딩을 잊지 마십시오. 다른 스레드에서 SetData를 호출하는 경우 EDT가 문제가됩니다. 물론. 추출 ApplicationData 객체는 다른 스레드에서 실행해야합니다.). 일반적으로 응용 프로그램의 디자인을 다시 생각하십시오.

다른 팁

사용자가 항목 2를 선택하든 API 호출 SetSelection (2), 이벤트는 동일하게 나타납니다.

귀하의 문제에 대한 해결책은 선택이 변경 될 때 ItemStateChanged 코드를 원하는 것을 다시 생각할 수 있습니다. 앱이 각 조건에서 다르게 작동하는 이유는 무엇입니까? 아마도 당신이 당신의 이점에 사용할 수있는 유사점이있을 수 있습니다.

플래그를 사용할 때주의하십시오. ItemStateChanged 이벤트는 이벤트 디스패치 스레드에서 발생합니다. 이벤트는 플래그 상태를 설정 한 것과는 다른 스레드입니다. 이것은 깃발을 사용하는 것이 100% 신뢰할 수 없다는 것을 의미합니다.

선택을 설정하기 전에 코드에서 플래그를 설정 한 다음 리스너 에서이 플래그를 확인할 수 있습니다 (그리고 깃발이 설정된 경우 깃발을 설정하지 않음) ...

Java 6 이후 더 나은 방법이있을 수 있지만 이것이 내가 항상 사용했던 방식입니다 ...

편집하다: David가 지적했듯이 SwingUtilities를 사용하여 EDT에서 플래그를 설정하고 콤보를 업데이트해야합니다.

이벤트를 구별해야한다면, 디자인에 대한 재고가 필요한 무언가가있을 것입니다. MVC의 요점은 사용자의 실제 마우스 클릭에서 모델로 변경을 해제하는 것입니다.

아마도 당신은 의문의 관점에서 문제를 해결해야 할 것입니다 이 두 상황을 구별하고 싶을 것입니다. 그런 다음 목표를 달성하는 다른 방법에 대한 지침을 제공 할 수 있습니다.

그래서 나는 당신이 사용자 선택이 평범한 오래된 직접 상태 변경보다는 행동을 수행하기를 원한다고 생각합니다. 이는 유연성이 제한되어 발생하는 문제입니다 (특히 다른 방향으로 유연성이있는 경우 유연성은 항상 제한 될 것입니다).

나의 제안:

첫째, 항상 스윙에서 모델을 사용하여 바로 이동하십시오. 위젯은 복잡한 방법이며 다른 우려가 분할되기를 원합니다. 다행스럽게도 스윙은 이미 모델과 함께 있습니다.

일반적인 패턴은 모델간에 위임하는 것입니다. 따라서이 경우 데이터를 보유하는 "실제"기본 모델이 있습니다. Jcombobox와 실제 콤보 박스 모델 사이를 삽입하고 상태 변경 지침에 대한 조치를 수행하는 콤보 옥스 모델을 위임하십시오. 응용 프로그램 코드는 Jcombobox를 무시하고 위임 모델을 우회하여 실제 ComboboxModel을 바로 이동해야합니다. 그래서 다이어그램에서 :

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