当前位置: 代码迷 >> Eclipse >> 关于valueChanged与ListModel冲突的有关问题
  详细解决方案

关于valueChanged与ListModel冲突的有关问题

热度:100   发布时间:2016-04-23 13:47:14.0
关于valueChanged与ListModel冲突的问题
要实现的功能如下:有一个列表JList,当点击其中的元素时,右边的文本框将显示所选中的列表元素,点击按钮时将会删除所选中的元素。其中前面的功能用到valueChanged,后者调用列表模型的removeElementAt方法。
但总是会报错,是不是valueChanged与ListModel会发生冲突?有什么 解决办法?
代码:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JTextArea;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
*
* @author xujinnan
*/
public class listTest extends JFrame{
private DefaultListModel lm = new DefaultListModel();
JList list = new JList(lm);
JButton btn = new JButton("remove");
JTextArea jta = new JTextArea();

public void init(){
this.setSize(300, 200);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setLayout(new FlowLayout());
add(list);
add(btn);
add(jta);
list.setFixedCellWidth(50);
lm.addElement("aaa");
lm.addElement("bbb");
lm.addElement("ccc");
this.setVisible(true);

list.addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e){
jta.setText(list.getSelectedValue().toString());
}
});

btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
lm.removeElementAt(list.getSelectedIndex());
}

});
}
public static void main(String[] args) {
// TODO code application logic here
new listTest().init();
}
}

------解决方案--------------------
list.getSelectedValue()有可能返回null
list.addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e){
if (list.getSelectedValue()!=null)
jta.setText(list.getSelectedValue().toString());
}
});