gpt4 book ai didi

java - JList 上的 ListSelectionListener 不起作用

转载 作者:行者123 更新时间:2023-11-29 08:13:47 29 4
gpt4 key购买 nike

我在使用此监听器时遇到问题,一般情况下的 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 的每个部分时,您可以在那里观察。 if(e.getValueIsAdjusting()) 总是在您将鼠标拖到项目上时执行。当您在之前单击某个项目时释放鼠标时调用 else 部分。

您提供的代码中存在一些严重的问题,因此我尝试删除所有不必要的部分,例如

1. doMyMethod() 方法和 if(e.getValueIsAdjusting()) 中的代码片段永远不会被调用,因为您已经在检查在它被调用之前的那个条件。另外,无需编写处理监听器事件的方法,此代码应保留在私有(private)的监听器中。然后,如果您想以编程方式调用其代码,您可以调用 listener.valueChanged(evt)。

2. evt.getSource() 返回的对象是事件的作者,在这种情况下是 myList 而不是我认为您想要的所选项目,为此使用 getSelectedValue() 直接在源或 myList 上,因为此监听器仅服务于此列表。

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 有帮助。为了我们。

关于java - JList 上的 ListSelectionListener 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6105646/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com