Java - 从JList更新textFields

时间:2009-11-26 15:36:59

标签: java swing jlist

我正在使用Java创建一个地址簿GUI,我有一个JList,显示我ArrayList中所有人的姓名(这是由下面提到的updateinfo方法填充的)。我想要它,所以当我点击JList上的某个项目时,TextField随后会更新该人员的详细信息。之前我只使用了按钮,因此actionListeners。我想我明白JList必须使用ListSelectionListener,但我似乎无法实现这一点。我在下面添加了一段代码片段。有人可以帮忙吗?为了与actionlisteners保持连续性,我希望将其作为一个内部类,但这并不重要

JList jl;
DefaultListModel list;

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 ......)

答案 2 :(得分: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); 
   }


 }

答案 3 :(得分:0)

  

我想我明白JList必须   使用ListSelectionListener,但我不能   似乎实现了这个

好吧,然后从阅读JList API开始。您将在“如何使用列表”中找到Swing教程的链接,其中包含一个工作示例。

同样在本教程中,您将找到有关“如何编写列表选择侦听器”的部分,其中包含第二个示例。

从基础问题的教程开始。