我正在使用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);
答案 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教程的链接,其中包含一个工作示例。
同样在本教程中,您将找到有关“如何编写列表选择侦听器”的部分,其中包含第二个示例。
从基础问题的教程开始。