2009-11-26 138 views
0

更新文本框我正在使用Java地址簿的GUI,我有一個JList顯示在人的所有的名字我ArrayList(這是由下述updateinfo方法填充)。我想要它,所以當我點擊JList上的一個項目時,TextField就會隨着那些人的細節而更新。之前我只使用過按鈕,因此actionListeners。我想我明白JList必須使用ListSelectionListener,但我似乎無法執行此操作。我在下面添加了我的代碼片段。有人可以幫忙嗎?對於我actionlisteners連續性,我想它作爲一個內部類,但這不是重要的爪哇 - 從JList的

JList jl; 
DefaultListModel list; 

list = new DefaultListModel(); 
this.jl = new JList(this.list); 
//add ListSelectionListener???? 
updateList(); 
this.add(this.jl, layout); 

回答

0

你只需選擇監聽器添加到列表中,這樣的:

jl.addSelectionListener(new ListSelectionListener() { 

    public void valueChanged(ListSelectionEvent e) { 
    // evaluate e if necessary and call a method 
    // in your class to write the text in the textfield 
    int selectedRow = e.getFirstIndex(); // more complicate for multiselects 
    updateTextFieldWithName(selectedRow); // to be implemented 
    } 
}); 

使用匿名這裏的班級是最快捷的方式。閱讀起來有點難,但是一個典型的模式。

(剛看完你首選的內部類,但我不能代碼,這裏手頭沒有IDE飛...)

0

是的,你會想使用ListSelectionListener對於這一點,你會也可能想要將列表設置爲單選(ListSelectionModel.SINGLE_SELECTION)。這將允許用戶僅選擇列表中的一個項目。然後你可以添加listSelectionListener,並在事件的valueChanged中做類似下面的事情(不是精確的語法)。

valueChanged(ListSelectionEvent e){ 
    int idx = e.getFirstIndex(); 
    int idx2 = e.getLastIndex(); //idx and idx2 should be the same if you set SingleSel 
    if(idx==idx2){ 
    //here you can get the person detail however you have them stored. You can get them from the model like so, 
     Object personObj = MYLIST.getModel().getElementAt(int index); 
    } 


} 
1

您可以添加偵聽器,然後查詢當前選定的索引。

我爲你做了一個樣本,希望你覺得它有用。

這是相關部分:

private JComponent list() { 
     final JList list = new JList(data); 
     list.addListSelectionListener(new ListSelectionListener() { 
      public void valueChanged(ListSelectionEvent e) { 
      int i = list.getSelectedIndex(); 
      nameTextField.setText(i >= 0 ? data.get(i) : ""); 
      } 
     }); 
     return new JScrollPane(list); 
    } 

請記住,這並不是唯一的出路,這只是你的一個起點。

下面是完整的工作示例:

import java.util.Vector; 
import java.util.Arrays; 

import java.awt.BorderLayout; 

import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JLabel; 
import javax.swing.JComponent; 

import javax.swing.event.ListSelectionListener; 
import javax.swing.event.ListSelectionEvent; 

public class JListSample { 

    private Vector<String> data = new Vector<String>( 
      Arrays.asList(new String [] { 
        "one", "two", "three" 
      }) 
    ); 

    private JTextField nameTextField; 

    public static void main(String [] args) { 
     JListSample s = new JListSample(); 
     s.run(); 
    } 
    public void run() { 
     JFrame frame = new JFrame("Selection test"); 
     frame.add(list(), BorderLayout.WEST); 
     frame.add(editPanel()); 
     frame.pack(); 
     frame.setVisible(true); 

    } 

    private JComponent list() { 
     final JList list = new JList(data); 
     list.addListSelectionListener(new ListSelectionListener() { 
      public void valueChanged(ListSelectionEvent e) { 
      int i = list.getSelectedIndex(); 
      nameTextField.setText(i >= 0 ? data.get(i) : ""); 
      } 
     }); 
     return new JScrollPane(list); 
    } 
    private JComponent editPanel() { 
     JPanel panel = new JPanel(); 
     panel.add( new JLabel("Name:")); 
     nameTextField = new JTextField(10); 
     panel.add(nameTextField); 
     return panel; 
    } 
} 

這是顯示的內容:

sample http://img177.imageshack.us/img177/6294/capturadepantalla200911k.png

0

我想我明白,一個JList必須 使用ListSelectionListener但我不能 似乎實施這個

那好吧,然後從閱讀JList API開始。您將在「如何使用列表」中找到Swing教程的鏈接,其中包含一個工作示例。

同樣在本教程中,您將找到關於「如何編寫列表選擇監聽器」的部分,其中包含第二個示例。

從本教程開始您的基本問題。