Java Can';无法使用按钮或ListSelectionListener从JList获取值
我有一个swing GUI,在JScrollPane中有一个JList,我用字符串填充了它。我想从列表中获取所选字符串,但每次它都返回-1。我还挑选了一些不起作用的听众。在这里查找其他帖子,但无论我点击多少次,听众都不会被解雇。选择单一选择模式。 这是按钮方法。值为null,索引为-1Java 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
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文件,不知道自定义创建复选框如何更改组件的工作方式。非常感谢您的帮助!