2014-01-10 52 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

相關問題