Применение счетчика к элементу в списке - PullRequest
0 голосов
/ 21 июля 2011

У меня есть список, который надувается через локальный текстовый файл. У меня есть следующий код, который просто печатает выбранный элемент / элементы при нажатии кнопки.

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {
    int[] selection = jList3.getSelectedIndices();
            //  selection.toString();
            for (int i = 0; i < selection.length; i++){
                Object selString = jList3.getModel().getElementAt(selection[i]);

                System.out.println(selString);

            }
    }

Вместо того, чтобы печатать элемент, я бы хотел, чтобы каждый щелчок кнопкой мыши записывал каждый объект. Я понятия не имею, какой компонент, метод и т. Д. Для реализации. Любое руководство приветствуется.

Мой конечный результат будет примерно таким же.

System.out.println(SelString has been clicked X amount of times);

Ответы [ 3 ]

3 голосов
/ 22 июля 2011

Вы можете использовать PropertyChangeSupport для уведомления при каждом щелчке элементов jList, кроме того, вы должны создать прослушиватель для получения уведомлений о событиях (через propertyChangeSupport.addPropertyChangeListener).

Оказавшись там, вы можете получить свойства события, такие как имя свойства и новое значение свойства, которое в этом случае будет выбрано элементом в jList3, для подсчета количества нажатий на какой-либо элемент вы можете использовать HashMap, установив введите в качестве индекса элемента jList и связанное с ним значение, сколько раз был нажат элемент:

PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
HashMap<Integer, Integer> clickCounter = new HashMap<Integer, Integer>();

    public NewJFrame() {
        initComponents();
        propertyChangeSupport.addPropertyChangeListener(new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getPropertyName().equals("selectedIndex")) {
                    System.out.println("Selected index: " + evt.getNewValue());
                    System.out.println("Selected text: " + jList3.getModel().getElementAt(evt.getNewValue()));
                    if (clickCounter.containsKey((Integer) evt.getNewValue())) {
                        clickCounter.put((Integer) evt.getNewValue(), clickCounter.get((Integer) evt.getNewValue()) + 1);
                    } else {
                        clickCounter.put((Integer) evt.getNewValue(), 1);
                    }
                }
            }
        });
    }

    private void jList1MouseClicked(java.awt.event.MouseEvent evt) {
        // TODO add your handling code here:
        propertyChangeSupport.firePropertyChange("selectedIndex", -1, jList3.getSelectedIndex());
    }

В любое время вы можете узнать, сколько раз был нажат определенный элемент, используя clickCounter

3 голосов
/ 21 июля 2011

Используйте хеш-карту с вашими объектами (selString) в качестве ключей и счетчиком в качестве значения. Что-то вроде:

private Map<Object, Integer> buttonMap = new HashMap<Object, Integer>

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {
    Integer counter = null;
    int[] selection = jList3.getSelectedIndices();

    for (int i = 0; i < selection.length; i++){ 
        Object selString = jList3.getModel().getElementAt(selection[i]);
        counter = buttonMap.get(selString);
        if(counter == null) {
            buttonMap.put(selString, new Integer(0));
        }

        buttonMap.put(selString, new Integer(counter.intValue() + 1));
        System.out.println(selString + " has been clicked " + buttonMap.get(selString) + " times.");
    }
}
2 голосов
/ 22 июля 2011

Я бы предложил использовать внутренний класс, который содержит любой объект, который вы в настоящее время помещаете в JList, и добавить переменную-член счетчика, а также переопределить toString ().

class MyListItem 
{
   int selectionCount;
   Object listItem; //may consider generics here, but left them out cause they can be tricky
   public MyListItem(Object item) 
   {
      selectionCount=0;
      listItem=item;
   }
   public void incrementSelectionCount()
   {
      selectionCount++;
   }
   public String toString()
   {
      return listItem.toString() + " has been clicked " + selectionCount + " times."); 
   }
}

Затем в слушателе действий

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) 
{                   
    int[] selection = jList3.getSelectedIndices();                           

    for (int selectedIndex : selection)
    {
       Object selString = jList3.getModel().getElementAt(selectedIndex);
       if(selString instanceOf MyListItem)
       {
           MyListItem selItem = (MyListItem) selString;
           selItem.incrementSelectionCount();
           System.out.println(selString);  
       }                                        
    }                   
} 

Это должно сэкономить время при поиске, боксе и т. Д. Кроме того, это помогает сохранять разумность в процессе роста проекта, поскольку MyListItem может быть увеличен для работы со всеми типами действий, которые вам могут понадобиться в будущем.в случае, если вы хотите, чтобы происходили разные вещи, кроме нажатий кнопок.Основная идея здесь заключается в том, что MyListItem должен отслеживать все, что вас интересует в отслеживании, поэтому вам не нужно многократные списки и, что еще хуже, не забудьте добавить элемент в JList и HashMap или любую другую структуру данных.Таким образом, это либо на каждой структуре данных, она должна быть, либо не на всех.

...