0

我正在使用 Java 制作一个地址簿 GUI,并且我有一个JList显示我的所有人员姓名(这是通过下面提到ArrayList的方法填充的)。updateinfo我想要它,所以当我单击 上的一个项目时JListTextFields 会使用该人的详细信息进行更新。在我只使用按钮之前,因此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

4 回答 4

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;
    }
}

这是显示的内容:

示例 http://img177.imageshack.us/img177/6294/capturadepantalla200911k.png

于 2009-11-26T16:17:50.790 回答
0

我想我知道 JList 必须使用 ListSelectionListener 但我似乎无法实现这一点

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

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

从基本问题的教程开始。

于 2009-11-26T17:10:57.200 回答
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 的情况下在这里即时编写代码......)

于 2009-11-26T15:47:45.577 回答
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); 
   }


 }
于 2009-11-26T15:48:01.583 回答