2011-09-24 8 views
2

어떤 JCheckBox가 선택되었는지를 결정해야하는 프로그램에서 작업하고 있습니다. 나는 세 개의 서로 다른 버튼 그룹을 사용하는데, 두 개는 겹쳐진 텍스트를 가지고있다. 나는 어떤 사건을 일으켰는지를 결정할 수 있어야 합계 (costOfHome)에 적절한 요금 (COSTPERROOM vs COSTPERCAR)을 추가 할 수 있습니다. 알아낼 수없는 것은 텍스트가 동일하면 확인란 소스를 구분하는 방법입니다. 하나의 단추 그룹에있는 텍스트를 "하나" "두"등의 문자열로 변경하려고 시도했지만 생각보다 먼저 큰 확인란을 만들었습니다. 어떤 아이디어라도 감사 할 것입니다, 미리 감사드립니다!JCheckBox 텍스트가 동일 할 때 어떤 JCheckBox가 이벤트를 발생시키는지를 어떻게 알 수 있습니까?

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class JMyNewHome extends JFrame implements ItemListener { 

    // class private variables 
    private int costOfHome = 0; 

    // class arrays 
    private String[] homeNamesArray = {"Aspen", "Brittany", "Colonial", "Dartmour"}; 
    private int[] homeCostArray = {100000, 120000, 180000, 250000}; 

    // class constants 
    private final int MAXROOMS = 3; 
    private final int MAXCARS = 4; 
    private final int COSTPERROOM = 10500; 
    private final int COSTPERCAR = 7775; 

    JLabel costLabel = new JLabel(); 

    // constructor 
    public JMyNewHome() 
    { 
     super("My New Home"); 
     setSize(450,150); 
     setLayout(new FlowLayout()); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Font labelFont = new Font("Time New Roman", Font.BOLD, 24); 

     setJLabelString(costLabel, costOfHome); 
     costLabel.setFont(labelFont); 
     add(costLabel); 

     JCheckBox[] homesCheckBoxes = new JCheckBox[homeNamesArray.length]; 
     ButtonGroup homeSelection = new ButtonGroup(); 
     for (int i = 0; i < homeNamesArray.length; i++) 
     { 
      homesCheckBoxes[i] = new JCheckBox(homeNamesArray[i], false); 
      homeSelection.add(homesCheckBoxes[i]); 
      homesCheckBoxes[i].addItemListener(this); 
       add(homesCheckBoxes[i]); 
     } 

     JLabel roomLabel = new JLabel("Number of Rooms in Home"); 
     add(roomLabel); 

     ButtonGroup roomSelection = new ButtonGroup(); 
     JCheckBox[] roomCheckBoxes = new JCheckBox[MAXROOMS]; 
     for (int i = 0; i < MAXROOMS; i++) 
     { 
      String intToString = Integer.toString(i + 2); 
      roomCheckBoxes[i] = new JCheckBox(intToString); 
      roomSelection.add(roomCheckBoxes[i]); 
      roomCheckBoxes[i].addItemListener(this); 
      add(roomCheckBoxes[i]); 
     } 

     JLabel carLabel = new JLabel("Size of Garage (number of cars)"); 
     add(carLabel); 

     ButtonGroup carSelection = new ButtonGroup(); 
     JCheckBox[] carCheckBoxes = new JCheckBox[MAXCARS]; 
     for (int i = 0; i < MAXCARS; i++) 
     { 
      String intToString = Integer.toString(i); 
      carCheckBoxes[i] = new JCheckBox(intToString); 
      carSelection.add(carCheckBoxes[i]); 
      carCheckBoxes[i].addItemListener(this); 
      add(carCheckBoxes[i]); 
     } 

     setVisible(true); 

    } 

    private void setJLabelString(JLabel label, int cost) 
    { 
     String costOfHomeString = Integer.toString(cost); 
     label.setText("Cost of Configured Home: $ " + costOfHomeString + ".00"); 
     invalidate(); 
     validate(); 
     repaint(); 
    } 

    public void itemStateChanged(ItemEvent e) { 
     JCheckBox source = (JCheckBox) e.getItem(); 
     String sourceText = source.getText(); 
     //JLabel testLabel = new JLabel(sourceText); 
     //add(testLabel); 
     //invalidate(); 
     //validate(); 
     //repaint(); 
     for (int i = 0; i < homeNamesArray.length; i++) 
     { 
      if (sourceText == homeNamesArray[i]) 
      { 
       setJLabelString(costLabel, costOfHome + homeCostArray[i]); 
      } 
     } 
    } 
} 
+1

에 리스너를 추가하는 대신'문자열 [] homeNamesArray' 및'INT [] homeCostArray', 그것은 더 나은 될 것입니다 'Home [] homesArray' 배열을 하나 가지고 있습니다. 여기서'Home'은'String name'과'int cost'를 캡슐화 한 POJO입니다. –

답변

3

나는 것보다는 JCheckBoxes보다는 이것에 대한

  • 사용 JRadioButtons 나는 하나 개의 선택이 아닌 JCheckBoxes의 집합을 허용 JRadioButtons의 집합을 가지고 GUI 표준이라고 생각하기 때문이다.
  • "겹치는 텍스트"가있을 수 있지만 버튼의 actionCommand를 원하는대로 설정할 수 있습니다. 그래서 하나의 버튼 세트는 "방 카운트 2", "방 카운트 3"의 액션 커맨드를 가질 수 있습니다 ...
  • 더 좋게도 ButtonGroup은 체크 박스 또는 라디오 버튼 중 어떤 토글 버튼이 선택한 버튼의 ButtonModel을 가져오고 (아무 것도 선택되지 않은 경우 null), getActionCommand() 메소드를 통해 모델에서 actionCommand를 가져올 수 있기 때문에, 선택한 버튼의 을 호출하면 이후로 선택됩니다. 먼저 선택한 모델이 null이 아닌지 확인하십시오.
  • 레이아웃 관리자를 사용하면 훨씬 쉽게 작업을 수행 할 수 있습니다. 두 ButtonGroups가 있다면 예를 들어

:

ButtonGroup fooBtnGroup = new ButtonGroup(); 
ButtonGroup barBtnGroup = new ButtonGroup(); 

당신이이 ButtonGroups에 JRadioButtons의 무리를 추가 할 경우, 당신은 다음과 같이하는 그룹 (다음 코드 선택 된 버튼을 확인할 수 있습니다 JButton의 ActionListener에 있습니다.) :

ButtonModel fooModel = fooBtnGroup.getSelection(); 
String fooSelection = fooModel == null ? "No foo selected" : fooModel.getActionCommand(); 

ButtonModel barModel = barBtnGroup.getSelection(); 
String barSelection = barModel == null ? "No bar selected" : barModel.getActionCommand(); 

System.out.println("Foo selected: " + fooSelection); 
System.out.println("Bar selected: " + barSelection); 

물론 버튼에 대한 actionCommand를 설정했다고 가정합니다.