Как получить дескриптор для всех объектов JCheckBox для того, чтобы цикл? - PullRequest
1 голос
/ 23 мая 2010

Я очень новичок в Java, и у меня возникают некоторые проблемы, связанные с циклом JCheckBoxes в пользовательском интерфейсе. Идея состоит в том, что у меня есть несколько флажков (не в группе, потому что можно выбрать более одного). Когда я нажимаю кнопку JButton, я хочу создать строку, содержащую текст из каждого выбранного флажка. У меня проблема в том, что наш инструктор сказал нам, что флажки нужно создавать с помощью метода, что означает (см. Код ниже), что для каждого флажка нет отдельного имени экземпляра. Если бы они были, я мог бы сказать что-то вроде

if(checkBox1.isSelected()) {
  myString.append(checkBox.getText());
}

Это будет повторяться для checkBox2, checkBox3 и так далее. Но предоставленный нам метод добавления флажков на панель выглядит следующим образом:

public class CheckBoxPanel extends JPanel {
private static final long serialVersionUID = 1L;

public CheckBoxPanel(String title, String... options) {
    setBorder(BorderFactory.createTitledBorder(BorderFactory
            .createEtchedBorder(), title));
    setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

    // make one checkbox for each option
    for (String option : options) {
        JCheckBox b = new JCheckBox(option);
        b.setActionCommand(option);
        add(b);
    }
}

}

Это называется так:

toppingPanel = new CheckBoxPanel("Each Topping $1.50", "Tomato", "Green Pepper", 
                                    "Black Olives", "Mushrooms", "Extra Cheese",
                                    "Pepperoni", "Sausage");

Итак, теперь у меня есть панель с рамкой с заголовком «Каждый топпинг по $ 1,50» и 7 видимыми флажками. Что мне нужно сделать, это получить список всех выбранных начинок. Мы не должны использовать ActionListener для каждого флажка, а получим список при нажатии кнопки. Я чувствую себя по-настоящему невежественным, но я просто не могу понять, как получить свойство isSelected для флажков, когда отдельные флажки не имеют имен экземпляров.

В идеале я хотел бы как-то добавить все флажки в массив и просмотреть массив в обработчике действий кнопки, чтобы определить, какие из них проверены, но если мне придется проверять каждый из них по отдельности, я это сделаю. Я просто не могу понять, как ссылаться на отдельные флажки, когда они были созданы динамически.

Ответы [ 3 ]

2 голосов
/ 23 мая 2010

Я предполагаю, что вы вообще не можете изменять код CheckBoxPanel. Это кажется бесполезным упражнением, потому что в реальном мире вы бы подумали, что если CheckBoxPanel, где вам предоставляется класс (например, в библиотеке), это будет включать способ получения выбранных опций. В любом случае, из-за ограничения, вы можете сделать что-то вроде этого:

for( int i=0; i<checkBoxPanel.getComponentCount(); i++ ) {
  JCheckBox checkBox = (JCheckBox)checkBoxPanel.getComponent( i );
  if( checkBox.isSelected() ) {
     String option = checkBox.getText();
     // append text, etc
  }
}
1 голос
/ 23 мая 2010

Я предлагаю вам сохранить список флажков:

List<JCheckBox> checkboxes = new ArrayList<JCheckBox>();

и до add(b) до:

checkboxes.add(b);

Затем вы можете перебирать список флажков в коде действия кнопок, используя конструкцию цикла «для каждого»:

for (JCheckBox cb : checkboxes)
    if (cb.isSelected())
        process(cb.getText()); // or whatever.

В качестве альтернативы, если вам нужно отслеживать конкретный индекс:

for (int i = 0; i < checkboxes.size(); i++)
    if (checkboxes.get(i).isSelected())
        ....
0 голосов
/ 23 мая 2010

Я бы посоветовал вам не ставить каждый из флажков в List при их создании. Вместо этого в вашем общем ActionListener вы сохраняете Set всех выбранных флажков. Используйте метод getSource на ActionEvent, чтобы определить, какой флажок выбрал пользователь, и затем приведите его к JCheckBox. Если isSelected() возвращает значение true для рассматриваемого элемента, попытайтесь добавить его к вашему selectedItems Set. Если это не так, попробуйте удалить его.

Затем вы можете просто перебрать подмножество всех элементов (только тех, которые выбраны) и распечатать их на консоли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...