3

Вопрос по java, swing – Как посчитать количество проверенных JCheckboxes?

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

РЕДАКТИРОВАТЬ:

cblist - это ArrayList, содержащий 11 JCheckBoxes. Я дал каждому JCheckBox прослушиватель элементов, и вот класс, используемый при нажатии флажков ...

private class CheckClass implements ItemListener{
      public void itemStateChanged(ItemEvent event){
         for(cblist.isChecked){
             ingnum++;
         }

      }
  }

В цикле for, как проверить все элементы ArrayList ... Я понимаю, что мой синтаксис сейчас неверен.

  • Как будет выглядеть мой код, чтобы проверить все JCheckboxes в массиве списков или нет, выбраны ли они? Я не уверен, как написать код, который будет проверять каждый элемент в AL.

    от Wilson
  • @JesusSqueegee: вы бы использовали простой цикл for, который получает каждый экземпляр JCheckBox из ArrayList, проверяет его выбор черезisSelected() Метод (познакомьтесь с API - он должен быть вашим лучшим другом прямо сейчас) в блоке if, и если true, он увеличивает переменную int counter. Попробуйте, и давайте посмотрим, что вы придумали.

    от
  • @JesusSqueegee: я думал, что только что сказал вам это - вы перебираете ArrayList с циклом for - это не что иное, как самая простая Java. Уточните пожалуйста - что именно вас смущает? Пожалуйста, покажите, что вы пытались изменить в качестве исходного вопроса.

    от
  • Большое спасибо, но мой вопрос на самом деле еще проще, ха-ха. Я понимаю этот процесс, но не понимаю, какой синтаксис используется для проверки каждого элемента в ArrayList.

    от Wilson
  • не важно, понял. Спасибо!

    от Wilson
  • Вы можете дать каждому из этих ItemListeners ссылку на объект, который вы создаете и который имеет два метода; один, который увеличивает количество выбранных флажков, и один, который уменьшает его. Всякий раз, когда пользователь выбирает или снимает флажок, вы можете вызывать соответствующий метод этого класса. Тогда вам нужно только создать метод для считывания числа из этого класса, и вы сделали =)

    от Bartvbl
  • Если вы просто заботитесь о количестве выбранных JCheckBoxes, просто определите целочисленный счетчик и добавьте этот оператор if для каждого ItemListener или ActionListener. Каждый раз, когда установлен флажок, счетчик увеличивается, каждый раз, когда флажок снимается, он уменьшается. if (jCheckBox1.isSelected ()) counter ++; еще счетчик--;

    от Costis Aivalis
  • @bartvbl: ваш комментарий мне кажется правильным. Почему бы не опубликовать его как таковой, чтобы мы могли проголосовать за него?

    от Hovercraft Full Of Eels
  • 2

    вы можете держать глобальный счетчик

    countChecked и сделать рамкуimplements ItemListener

    для всехJCheckBox в твоем кадреchkBox.addItemListener(this) и обрабатывать события

    public class MyFrame extends JFrame implements ItemListener{
    
    private int countChecked = 0;
    private JPanel contentPane;
        public MyFrame() {
        contentPane = new JPanel();
        setContentPane(contentPane);
        JCheckBox chckbx = new JCheckBox("New check box");
        contentPane.add(chckbx, BorderLayout.CENTER);
        chckbx.addItemListener(this);
    }
    
    @Override
    public void itemStateChanged(ItemEvent ie) {
        if(ie.getSource().getClass() == JCheckBox.class)
        {
            if(ie.getStateChange() == ie.SELECTED)
                countChecked++;
            else if(ie.getStateChange() == ie.DESELECTED)
                countChecked--;
        }
    
    } 
    }
    

  • 1

    добавить &

    quot; ActionPerformed & quot; прослушиватель событий для всех ваших флажков & amp; вызовите этот метод внутри метода обработчика событий, чтобы получить количество отмеченных флажков:

    int countCheckedCheckBoxes(){
        Component[] cs = getRootPane().getComponents();
        int checkNums = 0;
        for(Component c : cs){
            if(c instanceof JCheckBox){
                if(((JCheckBox)c).isSelected()){
                    checkNums++;
                }
            }
        }
        return checkNums;
    }
    

    getRootPane должен вернуть вашей главной панели, какие компоненты расположены на ней.

  • 6

    Один из способов: поместить все JCheckBox в массив или

    ArrayList<JCheckBox> и, при желании, просто переберите список, чтобы увидеть, какие флажки установлены.

    Другое возможное решение: если у вас есть табличная структура, используйте JTable, который содержит логические значения в своей модели, затем при желании выполните итерацию по строкам TableModel, чтобы увидеть, какие строки содержат значения Boolean.TRUE.

  • 2

    Мое предложение (возможно

    не самое лучшее) состоит в том, чтобы сохранить все отмеченные флажки в списке.

    Так что слушатель для всего JCheckBoxex будет выглядеть так:

    void stateChanged(ChangeEvent e){
        if( CheckBox is checked){
           // add the checkbox in the list.
        } else {
            // remove CheckBox in the list.
         }
    }
    

    Чтобы узнать, сколько проверено checkBox, просто посчитайте размер списка.

    С уважением.