将对象添加到JList
我有一个对象 - ArrayList<User> users
,它包含几个用户对象。将对象添加到JList
public class User
{
int id;
String name;
String location;
}
我想把此ArrayList将在JList所以它会显示用户名 -
John
Mick
Sam
Joe
---当我选择一个用户名触发一个事件,让我进行一些使用适当的用户对象进行操作。所以有人点击'米克',我得到这样的代码(伪代码) -
public jListClicked(User user)
{
int id = user.id;
String name = user.name;
String location = user.location;
updateDatabase(id, name, location);
}
我认为这是可能的使用JList?毕竟我想象这是JList组件的创建目的。那么如何将一个像ArrayList这样的对象添加到JList中,这样我就可以拥有上述功能了?
JList接受其构造函数的一个Object []。你可以使用.toArray()
函数从你的ArrayList中得到这个。我相信(我可能是错的...),如果你的User类覆盖了toString()
方法,JList将在它显示你的对象时使用它。
public class User
{
int id;
String name;
String location;
public String toString() {
return name;
}
}
我会推荐阅读java文档中JList的文档。它有一个如何构建自定义单元格渲染器的例子,以按照您希望显示的方式显示列表中的项目。这很容易遵循。它也有一个如何创建鼠标点击侦听器的例子。你应该能够复制/粘贴大部分。
正确,[默认渲染器](http://docs.oracle.com/javase/tutorial/uiswing/components/list.html#渲染器)通过调用'toString()'来显示非图标对象。 – trashgod 2012-03-01 02:44:03
-1为了显示原因而重写toString。自定义视觉表示的Swing方式是自定义ListCellRenderer。 – kleopatra 2012-03-01 12:56:10
@kleopatra是一个有价值的观点; ['JList'教程](http://docs.oracle.com/javase/tutorial/uiswing/components/list.html)的链接可以改善这个问题。 – trashgod 2012-03-01 18:34:26
,我们关心这种情况JList的构造函数接受对象的数组,托尼已经指出。这是关于他的答案停止有用的地方(Tony没有违法)。
默认情况下,JList使用的ListCellRenderer会添加包含来自Object#toString()的文本的JLabel。因此,不是传递字符串,而是传递一个用户对象数组,然后添加一个ListSelectionListener(在用户单击JList之后使用)和一个ListCellRenderer(它确定如何将用户对象转换为JComponent这将被绘制为JList的一部分)。
你想要做这样的事(详见在线评论):
//generate your user data
User[] userData = ...;
//add an array of Objects to a JList using the constructor
//(all classes extend java.lang.Object, including User)
JList foo = new JList(userData);
//overwrite the ListCellRenderer. This will take care of just displaying
//the name of the user
foo.addListSelectionListener(new ListSelectionListener(){
JLabel rv = new JLabel();
@Override
public Component getListCellRendererComponent(JList list,
Object value, int index, boolean isSelected,
boolean cellHasFocus){
String s = (value != null && value instanceof User)? ((User)value).name:"";
rv.setText(s);
if (isSelected) {
rv.setBackground(list.getSelectionBackground());
rv.setForeground(list.getSelectionForeground());
} else {
rv.setBackground(list.getBackground());
rv.setForeground(list.getForeground());
}
rv.setEnabled(list.isEnabled());
rv.setFont(list.getFont());
rv.setOpaque(true);
return rv;
}
});
//Now overwrite the ListSelectionListener which will take care of getting
//user object when the user clicks it
foo.addListSelectionListener(new ListSelectionListener(){
@Override
public void valueChanged(ListSelectionEvent lse) {
User selectedValue = (User)((JList)lse.getSource()).getSelectedValue();
//now you can do something with the User Object that was just selected
updateDatabase(selectedValue.id, selectedValue.name,
selectedValue.location);
});
肯定,一切皆有可能与Swing :-)请务必阅读并了解基本教程,f.i. http://docs.oracle.com/javase/tutorial/uiswing/index.html – kleopatra 2012-03-01 12:59:57