2013-11-28 2 views
0

어떤 종류의 DataCollection에 슈퍼 클래스 Animal의 Cows, DogsCats을 등록하는 프로그램이 있습니다. 사용자가 "동물 추가"버튼을 누르고 그 곳에서 을 매개 변수로 사용하여 Cow[] - Dog[] - Cat[]의 3 개 체크 박스가 있고 해당 데이터 필드에 적절한 텍스트 필드를 추가했는지에 따라 ConfirmDialog을 엽니 다. 이런 종류의 동물이 필요합니다.사용자 선택에 따라 ConfirmDialog의 레이아웃 변경

확인란이 선택되었을 때 수신기를 추가 한 다음 해당 유형에 대해 원하는 새 필드를 추가하거나 더 똑똑한 방법으로이 방법을 사용할 수 있습니까?

+1

* "내가 프로그램을 가지고 있다면 [...]"* downvote에 충분한 이유! –

+0

나는 프로그램을 가지고있다. 나는이 문제가 내 코드와 관련이 거의 없다고 생각했다. 내 문제가 구문보다는 사고 방식으로 진화하는 것을 볼 수 있기 때문이다. –

+0

일부 수신기를 추가하려고 했습니까? –

답변

0

동물 유형마다 특수한 입력 구성 요소가있는 패널을 만들고 세 패널을 모두 CardLayout을 사용하는 별도의 JPanel에 배치합니다. CardLayout는 주어진 시간에 자식 하나만 표시합니다. 각 하위 항목은 사용자가 선택하는 문자열 ID로 식별되며 하위 항목을 추가 할 때 지정해야합니다.

CardLayout은 컨테이너의 기본 크기가 모든 하위 요소를 수용 할 수있을만큼 커야 항상 표시되도록하기 때문에 구성 요소를 동적으로 추가하는 것보다 낫습니다. 그러면 표시되는 구성 요소를 변경할 때 대화 상자가 주변을 뒤섞 지 않게됩니다.

private static final String COW_CARD_ID = "cow"; 
private static final String DOG_CARD_ID = "dog"; 
private static final String CAT_CARD_ID = "cat"; 

void buildConfirmDialog() { 

    JPanel cowFieldsPanel = new JPanel(); 
    // Add cow-specific components here 

    JPanel dogFieldsPanel = new JPanel(); 
    // Add dog-specific components here 

    JPanel catFieldsPanel = new JPanel(); 
    // Add cat-specific components here 

    final CardLayout cardLayout = new CardLayout(); 
    final JPanel animalSpecificFieldsPanel = new JPanel(cardLayout); 
    animalSpecificFieldsPanel.add(cowFieldsPanel, COW_CARD_ID); 
    animalSpecificFieldsPanel.add(dogFieldsPanel, DOG_CARD_ID); 
    animalSpecificFieldsPanel.add(catFieldsPanel, CAT_CARD_ID); 

    JRadioButton cowButton = // ... 
    JRadioButton dogButton = // ... 
    JRadioButton catButton = // ... 

    cowButton.addItemListener(new ItemListener() { 
     public void itemStateChanged(ItemEvent event) { 
      if (event.getStateChange() == ItemEvent.SELECTED) { 
       cardLayout.show(animalSpecificFieldsPanel, COW_CARD_ID); 
      } 
     } 
    }); 

    dogButton.addItemListener(new ItemListener() { 
     public void itemStateChanged(ItemEvent event) { 
      if (event.getStateChange() == ItemEvent.SELECTED) { 
       cardLayout.show(animalSpecificFieldsPanel, DOG_CARD_ID); 
      } 
     } 
    }); 

    catButton.addItemListener(new ItemListener() { 
     public void itemStateChanged(ItemEvent event) { 
      if (event.getStateChange() == ItemEvent.SELECTED) { 
       cardLayout.show(animalSpecificFieldsPanel, CAT_CARD_ID); 
      } 
     } 
    }); 

    ButtonGroup buttonGroup = new ButtonGroup(); 
    buttonGroup.add(cowButton); 
    buttonGroup.add(dogButton); 
    buttonGroup.add(catButton); 
} 

그것은 예상 할 때 사용자가 많은 항목의 목록에서 정확히 하나의 항목을 선택할 수 있음을 언급 아마 가치, 당신은 라디오 버튼,하지 확인란을 사용합니다. Swing에서 JRadioButtons는 거의 항상 하나의 공통 ButtonGroup에 추가되어 하나의 많은 기능을 갖습니다.

관련 문제