JList的getSelectedIndex()总是返回-1,因为选择了一个项目

时间:2015-12-28 16:28:44

标签: java swing jscrollpane jlist

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);       
}
  

这里我用Objects填充我的数组并将它们添加到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()));
}  

2 个答案:

答案 0 :(得分:4)

不清楚代码出错的地方。这个竞争示例可能允许您孤立地研究问题。另外,请考虑添加ListSelectionListener以查看效果。

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

image

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);
        });
    }
}

答案 1 :(得分:1)

  • 不使用静态变量

  • 始终要测试if (list.getSelectedIndex() > -1) {

  • ListSelectionListener使用JList,始终测试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(); }); } }

例如

(不使用ListSelectionListener)

enter image description here

{{1}}