2013-08-19 2 views
1

나는 라디오 버튼과 라디오 버튼에 바인딩 된 여러 라벨이있는 패널을 포함하는 동적으로 추가 된 패널들을 가지고있다. 선택한 라디오 버튼에 레이블이 바인딩 된 컨테이너를 가져 오거나 다른 단어 - 데이터가 선택한 라디오 버튼에 바인딩되도록 단추를 가져야한다고 가정합니다. 그러나이 컨테이너를 얻는 방법? 여기 스윙 : 컨테이너를 JRadioButton에 바인딩하는 방법?

내가이 일을하려고 내 코드입니다 (사실이 UI (보기) 측에 무슨 일이 일어나고 있는지 보여줄 수있는 그루터기이다) : 작업중인 같은

public class Test extends JFrame { 
    public static ButtonGroup radioButtons = new ButtonGroup(); 

    public Test() { 
     super("Test"); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setSize(200, 300); 

     final JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
     JButton addButton = new JButton("Add"); 
     addButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       panel.add(new PanelWithRadioButton("text1", "text2")); 
       panel.revalidate(); 
      } 
     }); 
     panel.add(addButton); 

     JButton infoButton = new JButton("Info"); 
     infoButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       for(Enumeration<AbstractButton> myRadioButtons = radioButtons.getElements(); 
        myRadioButtons.hasMoreElements();) { 
        JRadioButton btn = (JRadioButton) myRadioButtons.nextElement(); 

        if(btn.isSelected()) { 
         PanelWithTwoLabels panelWithLabels = (PanelWithTwoLabels) btn.getComponent(1); //Trying to get Component bind to selected JRadioButton 
         JOptionPane.showMessageDialog(null, "Text1: " + panelWithLabels.getLabel1Text() + ", Text2: " + panelWithLabels.getLabel2Text()); 
        } 
       } 
      } 
     }); 
     panel.add(infoButton); 

     getContentPane().add(panel); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new Test(); 
    } 

    //JRadioButton + Panel with two text fields 
    private class PanelWithRadioButton extends JPanel { 
     private JRadioButton rButton; 
     private PanelWithTwoLabels panelWithTwoLabels; 

     public PanelWithRadioButton(String text1, String text2) { 
      setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); 
      panelWithTwoLabels = new PanelWithTwoLabels(text1, text2); 
      rButton = new JRadioButton(); 
      rButton.add(panelWithTwoLabels); //Bind Component to JRadioButton 
      radioButtons.add(rButton); 

      add(rButton); 
      add(panelWithTwoLabels); 
     } 
    } 

    private class PanelWithTwoLabels extends JPanel { 
     private JLabel label1; 
     private JLabel label2; 

     public PanelWithTwoLabels(String text1, String text2) { 
      setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
      label1 = new JLabel(text1); 
      label2 = new JLabel(text2); 

      add(label1); 
      add(label2); 
     } 

     private String getLabel1Text() { 
      return label1.getText(); 
     } 

     private String getLabel2Text() { 
      return label2.getText(); 
     } 
    } 
} 

답변

4

소리가 난다 데이터 구동 Q & 프로그램. 표시된 방법은 컨테이너의 getComponents() 메서드에서 반환 된 배열을 재귀 적으로 순회하는 방식으로 기술적으로 가능하지만 결과는 포함 & 상속 계층 구조를 혼란스럽게합니다. 그것은 또한 가난하게 저울질한다.

here과 같이 모델 (문자열, 선택)과보기 (레이블, 버튼)를 분리하십시오. 표시되는 통지 방법 중 하나를 사용하여 해당 모델의보기를 들으십시오. 이 방식으로 뷰의 각 인스턴스는 자체 단추와 단추를 알고 있습니다. 거의 모든 표준 스윙 구성 요소가이 separable model architecture의 좋은 예입니다.

부록 : 내재적 인 디자인 제한을지지하기를 꺼리는 동안, 여기에 편리한 방법이 있습니다. PanelWithRadioButton에서

는 클라이언트의 속성으로 panelWithTwoLabels에 대한 참조를 추가 : actionPerformed()에서

rButton.putClientProperty("labels", panelWithTwoLabels); 

에서, panelWithTwoLabels 검색 할 속성을 사용 :

PanelWithTwoLabels panelWithLabels = 
    (PanelWithTwoLabels) btn.getClientProperty("labels"); 
+0

나는 살펴 보겠습니다. – trashgod

+0

필자는 내 질문에 대해 다시 말하기로 결정했습니다. 예제에 설명 된 내용은 작동 방식의 예입니다 (스텁이라고 부름). 모델에서 가져온 데이터는 두 개의 레이블 (모델의 데이터로 채워짐)이있는 라디오 버튼과 패널로 뷰에 배치됩니다. 그리고 정확히 이해하고 싶은 것은 버튼 그룹에서 특정 라디오 버튼을 선택할 때이 라벨에서 데이터를 가져 오는 방법입니다. 단추 그룹 모델을 통해 선택된 라디오 단추를 얻을 수 있지만 선택한 라디오 단추에 구성 요소 바인딩을 얻는 방법. 희망이 지금은 더 자세한 소리 :) – Dragon

+0

나는 위의 접근 방식을 설명했습니다. – trashgod

2

이 질문하지만 관련되지 .. .

panel.updateUI(); 

그런 식으로 updateUI() 메서드를 사용하십시오. updateUI() 메서드는 LAF가 변경 될 때 Swing에 의해 내부적으로 사용됩니다. 당신이 볼 GUI에 구성 요소를 추가 할 때

당신은 사용해야

panel.revalidat(); 
panel.repaint(); // sometimes needed 
+0

오, 고마워요. 간단히 말해서 updateUI()가 수행 할 때 다시 칠해도 작동하지 않는 경우가있었습니다. – Dragon