【问题标题】:Can't get value from a JList neither with a button or ListSelectionListener无法使用按钮或 ListSelectionListener 从 JList 获取值
【发布时间】:2021-07-10 20:43:06
【问题描述】:

我在 JScrollPane 中有一个带有 JList 的摇摆 GUI,并且我已经用字符串填充了它。我想从列表中获取选定的字符串,但每次它返回-1。我还制作了不起作用的选择侦听器。从这里的帖子中查找其他人,但无论我点击多少,听众都不会被解雇。选择单选模式。 这是按钮方法。值为空,索引为-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 
                }
            }
        });

【问题讨论】:

  • 您可能引用的 JList 与带有歌曲名称的 JList 不同。发布minimal reproducible example,以便我们将代码复制到我们的 IDE、运行它并查看结果来帮助您。

标签: java swing indexoutofboundsexception jlist listselectionlistener


【解决方案1】:

把所有东西放在一起它就可以工作了,所以你可能弄乱了一些变量(也许你初始化了一个 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();
    }
}

【讨论】:

  • 您好,感谢您的回答,即使我没有提供更多信息。我复制了您的代码并将其与我的代码进行了比较。最后的问题是我将侦听器放在构造函数中,而不是创建自定义组件的方法中。我正在使用 .form 文件,但不明白“自定义创建”复选框如何改变组件的工作方式。非常感谢您的帮助!
猜你喜欢
  • 2012-02-14
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2015-09-27
  • 1970-01-01
  • 2015-11-15
  • 2017-07-09
相关资源
最近更新 更多