Java Can';无法使用按钮或ListSelectionListener从JList获取值

Java Can';无法使用按钮或ListSelectionListener从JList获取值,java,swing,indexoutofboundsexception,jlist,listselectionlistener,Java,Swing,Indexoutofboundsexception,Jlist,Listselectionlistener,我有一个swing GUI,在JScrollPane中有一个JList,我用字符串填充了它。我想从列表中获取所选字符串,但每次它都返回-1。我还挑选了一些不起作用的听众。在这里查找其他帖子,但无论我点击多少次,听众都不会被解雇。选择单一选择模式。 这是按钮方法。值为null,索引为-1 loadSongBtn.addActionListener(new ActionListener() { @Override public void action

我有一个swing GUI,在JScrollPane中有一个JList,我用字符串填充了它。我想从列表中获取所选字符串,但每次它都返回-1。我还挑选了一些不起作用的听众。在这里查找其他帖子,但无论我点击多少次,听众都不会被解雇。选择单一选择模式。 这是按钮方法。值为null,索引为-1

 loadSongBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int index=list.getSelectedIndex();
                System.out.println("test "+list.getSelectedValue());
                String name=(String)list.getModel().getElementAt(index); //works if i put a number
            }
        });
以下是初始化:

 private void initList(){
        String[] songNames = extractSongs(); 
        JList songsList=new JList(songNames); //tried to see if the problem is here
        this.list=songsList;
    }
private void createUIComponents() {
        initList();
        songListPane = new JScrollPane(list);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    }
这是SelectionListener以防万一

list.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                    if (!e.getValueIsAdjusting()) {
                        JList<String> lst = (JList<String>) e.getSource();
                        String selection = lst.getSelectedValue();
                        System.out.println(selection);//doesnt go into the method at all in debug 
                }
            }
        });
list.addListSelectionListener(新的ListSelectionListener(){
@凌驾
public void值已更改(ListSelectionEvent e){
如果(!e.getValueIsAdjusting()){
JList lst=(JList)e.getSource();
字符串选择=lst.getSelectedValue();
System.out.println(selection);//在调试中根本不进入该方法
}
}
});

把所有的东西放在一起,它就工作了,所以你可能弄乱了一些变量(也许你初始化了一个JList并在那里注册了监听器,然后在方法initList()中重写它)。 下面是一个工作示例:

package test;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class TestJList {
    
    protected JList<String> list;
    protected JScrollPane songListPane;
    protected JButton loadSongBtn;
    
    private void initList(){
        String[] songNames = new String[] { "abba", "dsst", "crvg" };
        JList<String> songsList=new JList(songNames); //tried to see if the problem is here
        this.list=songsList;
    }
    
    private void createUIComponents() {
        initList();
        loadSongBtn=new JButton("Load");
        
        songListPane = new JScrollPane(list);
        songListPane.setPreferredSize(new Dimension(200,400));
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        
        list.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                    if (!e.getValueIsAdjusting()) {
                        JList<String> lst = (JList<String>) e.getSource();
                        String selection = lst.getSelectedValue();
                        System.out.println("SEL CHANGED "+selection);//doesnt go into the method at all in debug 
                }
            }
        });
        
        loadSongBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int index=list.getSelectedIndex();
                if (index<0) {
                    System.out.println("Nothing selected");
                    return;
                }
                System.out.println("BUTTON "+list.getSelectedValue());
                String name=(String)list.getModel().getElementAt(index); //works if i put a number
            }
        });
    }
    
    public TestJList() {
        initList();
        createUIComponents();
        JFrame frame=new JFrame("Test JList");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        Box content=new Box(BoxLayout.Y_AXIS);
        content.add(songListPane);
        content.add(loadSongBtn);
                
        frame.setContentPane(content);
        frame.pack();
        frame.setVisible(true);
    
    }
    public static void main(String[] args) {
        new TestJList();
    }
}
封装测试;
导入java.awt.Dimension;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.Box;
导入javax.swing.BoxLayout;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.JScrollPane;
导入javax.swing.ListSelectionModel;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
公共类测试列表{
受保护名单;
受保护的JScrollPane songListPane;
受保护的JButton loadSongBtn;
私有void initList(){
String[]songNames=新字符串[]{“abba”、“dsst”、“crvg”};
JList-songsList=new-JList(songNames);//尝试查看问题是否存在
this.list=songsList;
}
私有void createUIComponents(){
initList();
loadSongBtn=新的JButton(“加载”);
songListPane=新的JScrollPane(列表);
songListPane.setPreferredSize(新维度(200400));
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
addListSelectionListener(新的ListSelectionListener(){
@凌驾
public void值已更改(ListSelectionEvent e){
如果(!e.getValueIsAdjusting()){
JList lst=(JList)e.getSource();
字符串选择=lst.getSelectedValue();
System.out.println(“SEL CHANGED”+selection);//在调试中根本不进入该方法
}
}
});
loadSongBtn.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
int index=list.getSelectedIndex();

如果(indexYou可能引用了与歌曲名称不同的JList。发布a,以便我们可以通过将代码复制到IDE中、运行它并查看结果来帮助您。您好,感谢您的回答,即使我没有提供更多信息。我复制了您的代码并将其与我的代码进行了比较。最后,问题是我将侦听器是在构造函数中,而不是在创建自定义组件的方法中。我使用的是.form文件,不知道自定义创建复选框如何更改组件的工作方式。非常感谢您的帮助!