我有一个通过本地文本文件填充的列表。我有以下代码,当按钮被点击时,简单地打印选中的项目/项目。
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);
使用散列映射,对象(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.");
}
}
您可以使用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
我建议使用内部类来保存当前放入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);
}
}
}
这将节省查找、装箱等时间。此外,随着项目的发展,这也有助于保持项目的稳定性,因为mylisttitem可以处理所有类型的操作,以防你希望按键以外的事情发生不同的事情。这里的基本思想是,mylisttitem应该跟踪您感兴趣的所有内容,这样您就不需要多个列表,甚至更糟糕的是,要记住向JList和HashMap或任何其他数据结构添加项目。这样,它要么在所有需要的数据结构上,要么根本不在。