Java JList上的ListSelectionListener不工作
我在这个监听器上遇到了问题,gui一般构造和工作都很好,还有jlist,但是当我在列表中选择一些项目时,我看不到结果,也看不到我为测试目的编写的printl,请注意,为了在初始化时添加事件处理程序,此代码包含在getJContentPane中Java JList上的ListSelectionListener不工作,java,swing,jlist,Java,Swing,Jlist,我在这个监听器上遇到了问题,gui一般构造和工作都很好,还有jlist,但是当我在列表中选择一些项目时,我看不到结果,也看不到我为测试目的编写的printl,请注意,为了在初始化时添加事件处理程序,此代码包含在getJContentPane中 private JList myList=new JList(dlm);//a defaultlistmodel myList.addListSelectionListener(new ListSelectionListener() {
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);
}
});
域方法:
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拖动到项目上时,始终执行ife.getValueIsAdjusting。当您在先前单击某个项目时释放鼠标时,将调用else部分 您提供的代码中存在一些严重问题,因此我尝试删除所有不必要的内容,例如 1.doMyMethod方法和其中的ife.getValueIsAdjusting代码段将永远不会被调用,因为在调用之前您已经在检查该条件。另外,不需要编写处理侦听器事件的方法,这些代码应该留在侦听器内部,而侦听器是私有的。然后,如果希望以编程方式调用其代码,则可以调用listener.valueChangedevt 2.evt.getSource返回事件作者的对象在本例中,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);
}
});
}
}
希望即使它不能解决您的问题,它至少会有助于为我们建立一个新的解决方案 在试图理解您的问题中发生了什么之后,我了解到,当选择被更改时,您无法获取列表中的选定项 为了向您展示如何实现这一点,我构建了以下示例。当调用if-else的每个部分时,您可以在那里观察。将moue拖动到项目上时,始终执行ife.getValueIsAdjusting。当您在先前单击某个项目时释放鼠标时,将调用else部分 您提供的代码中存在一些严重问题,因此我尝试删除所有不必要的内容,例如 1.doMyMethod方法和其中的ife.getValueIsAdjusting代码段将永远不会被调用,因为在调用之前您已经在检查该条件。另外,不需要编写处理侦听器事件的方法,这些代码应该留在侦听器内部,而侦听器是私有的。然后,如果希望以编程方式调用其代码,则可以调用listener.valueChangedevt 2.evt.getSource返回事件作者的对象在本例中,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);
}
});
}
}
希望即使它不能解决您的问题,它至少会有助于为我们建立一个新的解决方案 尝试递归是怎么回事?没有注意到现在更改的递归方法:synoniemenList.addListSelectionListenernew ListSelectionListener{public void valueChangedListSelectionEvent evt{if evt.getValueIsAdjusting{System.out.printlnEventhandler调用;return;}调用System.out.printlnEventhandler;doevt;}@JBoy,请用新代码编辑你的问题。我不确定我是否理解你初始化代码的逻辑。如果内容窗格为空,则将侦听器添加到列表中,否则不添加它。一个合适的SSCE会更有帮助。@JBoy现在它甚至不会编译。您曾经使用过scrollboxBox和一行scrollBox,除非您已经定义了这两个字段,但是代码没有意义。我再次建议您提供一个SSCE。递归的尝试是什么?没有注意到递归方法,现在已更改:synoniemenList.AddListSelectionListener新建ListSelectionListener{public void valueChangedListSelectionEvent evt{if evt.getValueIsAdjusting{System.out.printlnEventhandler已调用;return;}System.out.printlnEventhandler已调用;doevt;};@JBoy,请用新代码编辑您的问题。我不确定我是否理解您初始化代码的逻辑。如果内容窗格为空,则将侦听器添加到列表中
请不要添加它。一个合适的SSCE会更有帮助。@JBoy现在它甚至不会编译。您曾经使用过scrollboxBox和一行scrollBox,除非您已经定义了这两个字段,但是代码没有意义。我再次建议您提供SSCCE。