문제

저는 JTabbedPane을 사용하여 제가 만들고 있는 마법사의 각 단계를 보관하고 있습니다.단계 간 탐색은 이전/다음 버튼을 사용하거나 탭을 선택하여 수행됩니다.버튼은 JTabbedPane의 SelectedIndex를 감소/증가시킵니다.

다음 단계로 진행하기 전에 각 단계를 검증해야 합니다.본질적으로 어떤 이벤트를 사용할지 결정하는 데 어려움을 겪고 있습니다.StateChange 이벤트가 너무 늦게 발생합니다.어떤 이벤트를 관찰해야 합니까?

또 다른 짜증:마법사가 실행될 때 JTabbedPane의 SelectedIndex 상태(일반적으로 마지막 단계의 값)를 저장하는 것으로 보이며, 이 값은 다음에 마법사가 실행될 때 SelectedIndex를 설정하는 데 사용됩니다.디자이너의 selectedIndex 속성은 변경되지 않았습니다.또한 JPanel 생성자에서 setSelectedIndex()를 호출해도 이에 영향을 미치지 않는 것 같습니다.내가 무엇을 놓치고 있나요?

도움이 되었습니까?

해결책

대신에 jtabbedpane, 사용 고려하십시오 Cardlayout. 후자를 사용하면 내비게이션을보다 엄격하게 제어 할 수 있습니다.

다른 팁

jtabbedpane을 확장하여 setSelectedIndex 메소드를 무시한 다음 super.SetSelectedIndex (index)를 호출 할 수 있습니다. 유효성 검사를 한 후 다음과 같은 것과 같은 것입니다.

public class ValidationTabbedPane extends JTabbedPane {
    private static final long serialVersionUID = 1L;

    public ValidationTabbedPane() {
        super();
      }

      @Override
      public void setSelectedIndex(int index) {
          if (index >= 0 && index < getTabCount()) {
              if(getSelectedIndex() == -1) {
                  super.setSelectedIndex(index);
              } else  {
                  Containers tab = tabs.get(getSelectedIndex());
                  boolean change = true;
                  if(tab.isDirty()) {
                      if(!MessageAlert.
                              yesNoMessage("You have unsaved changes. Do you want to change tab anyways? ", 
                                      mainTabbedPane)) {
                          change = false;
                      }
                  }
                  if(change) {
                      super.setSelectedIndex(index);
                  }
              }
          }           
      }
}

먼저, jtabbedpane을 사용하고 있는데, 이는 사용자가 모든 순서로 탭을 선택할 수 있고 마법사를 구현할 수 있음을 나타내며, 일반적으로 순차적 순서로 수행 해야하는 단계가 필요합니다. 이것이 올바른 UI 구성 요소인지 생각해보십시오.

둘째, 당신이 찾고있는 것은 거부 된 상태 변화이지만, 그것은 상자 밖에 존재하지 않습니다.

나는 이것을 발견했다 Sun의 포럼의 스레드:

내가 사용한 트릭은 Jtabbedpane에서 사용하는 단일 선정 모델을 대체하는 것입니다. 기본값을 연장하고 SetSelectedIndex 메소드를 과도하게하는 것은 작업이 잘 작동하는 것 같습니다 (스위치가 허용되는 경우에만 Super 메소드를 호출).

또한 Kirill Grouchnikov는 여기에 몇 가지 생각이 있습니다. "jtabbedpane을 향상시킵니다 - 파트 v".

탭이 이미 변경되었을 때 발사되기 때문에 너무 늦게 발생합니다. 필요한 것은 언제 변경 될지 알아야합니다.

시도 할 수있는 내용 (최선의 선택이 아닐 수도있는 탭 창을 사용한다고 주장하는 경우)은 마우스 리스너를 추가하고 유리창과 함께 사용하는 것입니다. 마우스 이벤트를 캡처하고 검증을 수행 할 수 있습니다. 성공하면 프로그래밍 방식으로 탭을 변경합니다.

alt text

이벤트를 연결해야하므로 코드를 작성하기가 약간 어렵습니다 (따라서 마법사에서 탭이 보이지 않는 이유입니다).

인덱스는 동일한 인스턴스를 사용하기 때문입니다. 생성자가 아닌 인스턴스에서 호출해야하기 때문에 효과가 없습니다.

다음은 사용 방법에 대한 샘플입니다 유리 판.

alt text

샘플에서 버튼의 클릭 이벤트를 가로 채는 방법을 확인하십시오. 투어 탭과 비슷한 것을 시도 할 수 있습니다.

천박한 대안(이미 대부분의 작업을 수행했고 지금은 급격한 변화를 싫어하기 때문에 그렇게 하려고 함)은 enabled 속성을 false로 설정합니다.탭 버튼은 비활성화되지만 다음 및 이전 버튼은 여전히 ​​예상대로 작동합니다.사용자가 이를 용인한다면 이는 쉬운 해결책이 될 수 있습니다.

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