문제

최근에 구현했습니다 Action 비즈니스 기능의 활성화 상태를 전환합니다. 사용자가 작업을 호출 할 때마다 부울 깃발을 설정했습니다. "의지가 있습니다"다음 호출이 함수를 활성화하거나 비활성화할지 여부를 결정하기 위해서도 새로운 상태를 반영하기 위해 동작 이름, 짧은 설명 및 아이콘을 업데이트합니다. actionPerformed(...) 방법 나는 상태에 따라 다른 조치를 취합니다. willEnable.

  1. 이것이 올바른 접근법입니까, 아니면 누구든지 더 나은 접근법을 추천 할 수 있습니까 (이것이 일반적인 문제라고 생각하기 때문에)? (나는 그것을 볼 수있다 JToggleButton 2- 상태 버튼 역할을하지만이 작업이JMenuBar 뿐만 아니라 JButton, 이것이 적절하다고 생각하지 마십시오).

편집하다

구체적으로, 아이디어와 같은 응용 프로그램은 이것을 어떻게 처리합니까? 그들은 다단계 액션 (위와 같이)을 사용합니까? 다른 Action 주어진 JButton 사용 setAction(Action)? 아마도이 접근법이 더 좋을까요?

  1. 작업 속성을 업데이트 할 때 초기화 된 GUI 구성 요소에 의존 할 수 있습니다. Action (예 :JButton) 자동으로 스스로를 다시 칠합니까? 만약 JButton결과적으로 크기 변경? 포함을 재평가해야합니다JPanel 내 자신?
  2. 행동의 이름을 바꾸는 것이 나쁜 일입니까? 이것이 JButton 텍스트를 변경할 수있는 유일한 방법이지만 작업이 ActionMap.

미리 감사드립니다.

도움이 되었습니까?

해결책

일부 데이터 "모델"으로 생성 된 GUI 구성 요소가 Action 데이터 모델로)는 해당 모델의 리스너로 등록해야합니다. 그것 ~ 해야 하다 a에 대한 적절한 행동을 취하십시오 PropertyChangeEvent 해고 당하기 : 다른 행동은 제 생각에 버그가 될 것입니다.

여기서 의심스러운 것은 행동의 이름을 바꾸는 것이 합법적인지 여부입니다. 내 생각에는 합법적이지 않습니다. 당신의 행동은 논리적입니다 Toggleenabledstatus 그리고 그것은 행동이 호출 되었기 때문에 변하지 않습니다. 다른 텍스트를 표시 해야하는 구성 요소는 자체를 청취자로 등록해야합니다. Action 그리고 당신을 확인하십시오 willEnable 적절한 행동을 취하는 깃발.

또는 구현 된 자신의 수업을 쓸 수 있습니다 ToggleButtonModel 그리고 Action 동시에 변경 이벤트를 통제했습니다. 그러나 이것은 많은 코드입니다.

다른 팁

당신은 그것을보고 싶을 수도 있습니다 상태 패턴.

기본적으로 각 상태마다 인터페이스와 두 가지 (또는 그 이상) 구현을 만듭니다. 간단한 예로서, 비활성화 상태는 인터페이스를 구현하여 아무것도하지 않도록하는 반면, 사용 가능한 상태는 일부 조치를 수행 할 수 있습니다. 상태를 전환하려면 단순히 그렇게 할 것입니다

interface IState {
  void doAction();
  boolean isEnabled();
}

class EnabledState implement IState {
  void doAction() {
    setState(new DisabledState());
    // do something
  }
  boolean isEnabled() {return true;}
}

class DisabledState implement IState {
  void doAction() {
    setState(new EnabledState());
    // do nothing
  }
  boolean isEnabled() {return false;}
}

private IState state = new DisabledState(); // default is disabled
private PropertyChangeSupport support = new PropertyChangeSupport(this);

void setState(IState state) {
  if (this.state != state) {
    IState oldState = this.state;
    this.state = state;
    support.firePropertyChange("enabled", oldState.isEnabled(), state.isEnabled());
  }
}

void doAction() {
  state.doAction();
}

단일 방법의 경우 약간의 오버 헤드이지만 단일 상태에 따라 동작을 변경하는 몇 가지 방법이있는 즉시 비용을 지불합니다.

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