2014-01-10 50 views
3

我已经创建了2个JLists'addGroupList'和'addApkList'。我使用model.addElement(arrayList1.get(arrayList1.size() - 1))将元素添加到addGroupList中;事情是,我想基于addGroupList的选定值更新addApkList。为此,我尝试添加事件侦听器,以便在选择列表项目时处理某些事件,但事件不会触发事件。 我该怎么做才能做到这一点? 以下是我正在使用的代码。如何将侦听器事件添加到由DefaultListModel对象添加的JList元素?

model1 = new DefaultListModel(); 
    model2 = new DefaultListModel(); 

    addApkList = new JList(model1); 
    addGroupList = new JList(model2); 

    scrollPane1 = new JScrollPane(); 
    scrollPane1.setViewportView(addApkList); 
    scrollPane2 = new JScrollPane(); 
    scrollPane2.setViewportView(addGroupList); 

这样我定义了JList。 在下面的方法,我已经添加元素addGroupList

model1.addElement(arrayList1.get(arrayList1.size()-1)); 

并在下面我添加监听器,它的方式。

addGroupList.addListSelectionListener(new ListSelectionListener() { 

     @Override 
     public void valueChanged(ListSelectionEvent lse) { 
      if (!lse.getValueIsAdjusting()) { 
       System.out.println("Selection trigerred"); 
      } 
     } 
    }); 

这段代码似乎没有发生任何变化。我做错了什么? 我也试过以下

model1.addListDataListener(new ListDataListener() { 

      @Override 
      public void intervalAdded(ListDataEvent lde) { 
       System.out.println("ddddddddddd"); 
       throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
      } 

      @Override 
      public void intervalRemoved(ListDataEvent lde) { 
       System.out.println("ddddddddddd"); 
       throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
      } 

      @Override 
      public void contentsChanged(ListDataEvent lde) { 
       System.out.println("ddddddddddd"); 
       throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
      } 
     }); 
+0

你确定你不需要为你的ListModel实现ListDataListener吗? http://docs.oracle.com/javase/7/docs/api/javax/swing/event/ListDataListener.html –

+0

请原因为... – mKorbel

+0

我试过ListDataListener。它不工作。更新我在尝试使用ListDataListener时使用的代码。 – Nikhil

回答

2

在下面的方式我已经添加元素addGroupList

model1.addElement(arrayList1.get(arrayList1.size()-1)); 

不,你没有。 model1addApkList列表模型不addGroupList

addApkList = new JList(model1); 

应该model2.addElement(arrayList1.get(arrayList1.size()-1))

在任何情况下,我怀疑你只是简单地将一个项目添加到列表模型时,你会预期ListSelectionEvent被解雇。那不会发生。您需要设置附加项作为选择的一个:

Object item = arrayList1.get(arrayList1.size()-1); 
model2.addElement(item); 
addGroupList.setSelectedValue(item, true); 

看看到JList.setSelectedValue(Object anObject, boolean shouldScroll)进一步的细节。

+0

是不容易共享一个ListSelectionModel为两个Jlists – mKorbel

+0

没关系,帮助。谢谢:) 我分配了model1到addGroupList和model2到addApkList。它 工作,但现在当我点击列表项目时,如果列表包含2个项目,则显示“选择trigerred”2次,如果列表包含3个项目,则显示3次。是什么原因? – Nikhil

+0

@ user2713104也许你每次添加一个新项目时都会在'addGroupList'中添加一个新的'ListSelectionListener'。这将解释这种行为。初始化列表时,您只需添加一次侦听器。 – dic19

2

我创造了2个JList的 'addGroupList' 和 'addApkList'。我将 元素添加到addGroupList中,使用 model.addElement(arrayList1.get(arrayList1.size() - 1));事情是,我 想要基于addGroupList的选定值更新addApkList。对于 这,我试图添加事件监听器,以便我可以采取行动 东西当选择列表项目,但事件不trigerring。 我该怎么做才能做到这一点?以下是我正在使用的代码。

例如

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

public class Testing extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private DefaultListModel listModel = new DefaultListModel(); 
    private DefaultListModel listModelEmpty = new DefaultListModel(); 
    private JList list = new JList(listModel); 
    private JList listEmpty = new JList(listModelEmpty); 
    private JPanel panel = new JPanel(new GridLayout(1, 1)); 
    private int currentSelectedRow = 0; 
    private int xX = 0; 

    public Testing() { 
     setLocation(400, 300); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     for (int x = 0; x < 9; x++) { 
      listModel.addElement("" + x); 
      xX++; 
     } 
     JScrollPane sp = new JScrollPane(list); 
     list.addListSelectionListener(new ListSelectionListener() { 
      @Override 
      public void valueChanged(ListSelectionEvent lse) { 
       if (!lse.getValueIsAdjusting()) { 
        System.out.println("Selection trigerred"); 
       } 
      } 
     }); 
     JScrollPane spEmpty = new JScrollPane(listEmpty); 
     panel.add(spEmpty); 
     panel.add(sp); 
     add(panel, BorderLayout.CENTER); 
     JButton btn1 = new JButton("Reset Model CastingModel"); 
     add(btn1, BorderLayout.NORTH); 
     btn1.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       //list.clearSelection(); 
       DefaultListModel model = (DefaultListModel) list.getModel(); 
       model.removeAllElements(); 
       for (int x = 0; x < 9; x++) { 
        model.addElement("" + (x + xX)); 
        xX++; 
       } 
       list.setModel(model); 
      } 
     }); 

     JButton btn2 = new JButton("Reset Model directly from Model"); 
     add(btn2, BorderLayout.SOUTH); 
     btn2.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       //list.clearSelection(); 
       listModel.removeAllElements(); 
       for (int x = 0; x < 9; x++) { 
        listModel.addElement("" + (x + xX)); 
        xX++; 
       } 
      } 
     }); 
     pack(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Testing().setVisible(true); 
      } 
     }); 
    } 
} 
+0

请看看这里 https://www.dropbox.com/s/l79ho0v25c3vswr/Screenshot%20%2895%29。png 如图所示,当我创建一个组时,它被列在左边的列表中。现在当我按下说'Nikhil'时没有任何反应。我正在尝试将斧头(在右侧列表中)改为别的东西。 – Nikhil

+1

+1为例,很好的例子:) – dic19

相关问题