如何解决JList上的ListSelectionListener不起作用
| 我在使用此侦听器时遇到问题,GUI的一般构造和工作正常,jlist也在那里,但是当我在列表中选择某些项时,我看不到结果,也看不到我出于测试目的而编写的printl() ,请注意此代码包含在getJContentPane中,以便在初始化时添加事件处理程序private JList myList=new JList(dlm);//a defaultlistmodel
myList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
if (evt.getValueIsAdjusting()){
System.out.println(\"Eventhandler called\");
return;
}
System.out.println(\"Eventhandler called\");
doMyMethod(evt);
}
});
doMyMethod():
private void doMyMethod(ListSelectionEvent e){
if(e.getValueIsAdjusting()){
return;
}else{
String item=(String)e.getSource();
accounter.add(item);
}
}
这是一个非常简单的方法,它以ListSelectionEvent的实例为参数
我认为主要的问题不是doMyMethod()执行了非常基本的动作,而是eventHandler根本没有被触发的事实,好像gui根本没有“监听”该列表。
任何想法?
这里是初始化代码:
private JScrollPane getScrollBox() {
if (scrollBoxBox == null) {
scrollBoxBox = new JScrollPane();
scrollBox.setBounds(new Rectangle(280,56,245,204));
scrollBox.getViewport().add(myList,null);
myList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
System.out.println(\"addListSelectionListener\");
if (evt.getValueIsAdjusting()){
System.out.println(\"Eventhandler called\");
return;
}
System.out.println(\"Eventhandler called\");
doMyMethod(evt);
}
});
}
return scrollBoxBox;
}
解决方法
尝试了解您的问题后,我了解到更改选择后,您无法在列表中获得所选项目。
为了向您展示如何实现此目标,我构建了以下示例。您可以在那里观察if else的每个部分。当将moue拖到项目上方时,始终执行
if(e.getValueIsAdjusting())
。在先前单击某个项目的同时释放鼠标时,将调用else部分。
您提供的代码中存在一些严重问题,因此我尝试删除了所有不必要的内容,例如
1.doMyMethod()
方法和其中的if(e.getValueIsAdjusting())
代码段将永远不会被调用,因为您已经在调用该条件之前检查了该条件。此外,无需编写处理侦听器事件的方法,此代码应保留在私有侦听器内。然后,如果要以编程方式调用其代码,则可以调用listener.valueChanged(evt)。
2.evt.getSource()
返回事件的作者,在这种情况下,my是myList而不是我认为您选择的所选项目,为此,请直接在源或myList上使用getSelectedValue()
,因为此侦听器仅提供此列表。
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class ListTest extends JPanel
{
private JScrollPane myScrollPane;
private JList myList;
private ListSelectionListener lSL = new ListSelectionListener()
{
@Override
public void valueChanged(ListSelectionEvent evt)
{
if(evt.getValueIsAdjusting())
{
System.out.println(\"Eventhandler called evt.getValueIsAdjusting() true\");
return;
}
else
{
// String item = (String) evt.getSource();//!!!Exception casting JList to String
//maybe what you need is getSelectedValue()
System.out.println(\"else called myList.getSelectedValue() =\"+myList.getSelectedValue());
}
}
};
private ListTest()
{
int noRows = 25;
Object[] listData = new String[noRows];
for(int i =0; i < noRows; i++)
listData[i]= \"Oi \"+i;
this.myList = new JList(listData);
this.myScrollPane = new JScrollPane(myList);
myList.addListSelectionListener(lSL);
add(myScrollPane);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
ListTest p = new ListTest();
JPanel contentPane = new JPanel();
contentPane.add(p);
JFrame f = new JFrame();
f.setContentPane(contentPane);
f.setSize(800,600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
});
}
}
希望即使它不能解决您的问题,至少也将对我们建立SSCCE有帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。