【问题标题】:getSelectedIndex() for JList always return -1 eventhough an item is selected即使选择了一个项目,JList 的 getSelectedIndex() 总是返回 -1
【发布时间】:2016-04-02 12:18:26
【问题描述】:

http://prntscr.com/9jhrwa "GUI 的外观"

公共类 Okno1 扩展 javax.swing.JFrame {

static Konto[]konto;
static DefaultListModel listModel;
static int indexKonta;
public Okno1() {
    initComponents();
    napolniKonto();
    jScrollPane1.setVisible(false);
    button_potrdiKonto.setVisible(false);       
}

在这里我用对象填充我的数组并将它们添加到 DefaultListModel,我还使用提到的 DefaultListModel 创建了一个新列表

    listModel=new DefaultListModel();
    list_konto.setModel(listModel);
    konto=new Konto[4];
    konto[0]=new Konto("10000/20000", "Test konto primer1");
    konto[1]=new Konto("20000/30000", "Test konto primer2");
    konto[2]=new Konto("50000/60000", "Test konto primer3");
    konto[3]=new Konto("30000/50000", "Test konto primer4");
    for (int i = 0; i < konto.length; i++) {
        listModel.addElement(konto[i].getID()+" | "+konto[i].getOpis());
    }

    list_konto=new JList(listModel);
    jScrollPane1.repaint();    
}

这里我在按下这个按钮时显示 jScrollPanel,如果我想在显示的 JList 中显示所选元素的索引,我还显示必须按下的按钮

   private void button_prikaziKontoActionPerformed(java.awt.event.ActionEvent evt) {                                                    
    jScrollPane1.setVisible(true);
    button_potrdiKonto.setVisible(true);
    //revalidate();
    //repaint();
}                

在这里我按下一个按钮,它应该让我获得所选项目的索引,但它一直给我 -1 并且是否选择了 JList 上的项目并不重要

private void button_potrdiKontoActionPerformed(java.awt.event.ActionEvent evt) {                                                   
    //indexKonta=list_konto.getSelectedIndex();
    text_opisKonta.setText(Integer.toString(list_konto.getSelectedIndex()));
}  

【问题讨论】:

    标签: java swing jscrollpane jlist


    【解决方案1】:
    • 不要使用静态变量

    • 一直在测试if (list.getSelectedIndex() &gt; -1) {

    • ListSelectionListener 用于JList,始终测试if (list.getSelectedIndex() &gt; -1) {

    例如(不使用 ListSelectionListener)

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.DefaultListModel;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JScrollPane;
    
    public class JListAndSelection {
    
        private JFrame frame = new JFrame();
        private DefaultListModel listModel = new DefaultListModel();
        private JList list = new JList(listModel);
        private JScrollPane scrollPane = new JScrollPane(list);
        private JLabel label = new JLabel("nothing is selected");
        private JButton button1 = new JButton("print me selected value");
    
        public JListAndSelection() {
            button1.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent ae) {
                    if (list.getSelectedIndex() > -1) {
                        label.setText((String) list.getSelectedValue());
                    } else {
                        label.setText("nothing is selected");
                    }
                }
            });
    
            listModel.addElement("10000/20000 - Test konto primer1");
            listModel.addElement("20000/30000 - Test konto primer2");
            listModel.addElement("50000/60000 - Test konto primer3");
            listModel.addElement("30000/50000 - Test konto primer4");
    
            list.setVisibleRowCount(5);
    
            frame.setTitle("JFrame");
            frame.add(label, BorderLayout.NORTH);
            frame.add(scrollPane, BorderLayout.CENTER);
            frame.add(button1, BorderLayout.SOUTH);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocation(150, 150);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(() -> {
                new JListAndSelection();
            });
        }
    }
    

    【讨论】:

    • 如果选择多行怎么办?
    【解决方案2】:

    不清楚您的代码哪里出错了。这个竞争的例子可以让你孤立地研究这个问题。也可以考虑加个ListSelectionListener看看效果。

    myList.addListSelectionListener((ListSelectionEvent e) -> {
        myLabel.setText(getSelectionIndex());
    });
    

    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import javax.swing.AbstractAction;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.event.ListSelectionEvent;
    
    /** @see http://stackoverflow.com/a/34497773/230513 */
    public class Test extends JPanel {
    
        private final String[] values = {"Value1", "Value2", "Value3", "Value4"};
        private final JList myList = new JList(values);
        private final JLabel myLabel = new JLabel();
    
        public Test() {
            myList.setSelectedIndex(values.length - 1);
            myLabel.setText(getSelectionIndex());
            this.add(myList);
            this.add(myLabel);
            this.add(new JButton(new AbstractAction("Show Selected Index") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    myLabel.setText(getSelectionIndex());
                }
            }));
        }
    
        private String getSelectionIndex() {
            return String.valueOf(myList.getSelectedIndex());
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(() -> {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new Test());
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            });
        }
    }
    

    【讨论】:

    • 好的,所以答案是我初始化了我的列表 2 次(1 次很多)所以我只需要删除这一行:list_konto=new JList(listModel);
    猜你喜欢
    • 1970-01-01
    • 2012-02-29
    • 2011-09-08
    • 2016-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多