Java 要从JList中获取选定索引。但是返回-1

Java 要从JList中获取选定索引。但是返回-1,java,swing,jlist,Java,Swing,Jlist,我制作了一个jlist,并使用setModel方法设置了一个默认列表模型。当我调用getSelectedIndex时,它返回-1。为什么 if (!listAdded.isSelectionEmpty()) { listModelAdded.removeElementAt(listAdded.getSelectedIndex()); listBankQuestions.remove(listAdded.getSelectedIndex()); Sy

我制作了一个jlist,并使用setModel方法设置了一个默认列表模型。当我调用getSelectedIndex时,它返回-1。为什么

if (!listAdded.isSelectionEmpty()) {
        listModelAdded.removeElementAt(listAdded.getSelectedIndex());
        listBankQuestions.remove(listAdded.getSelectedIndex());
        System.out.println(i);
        --i;
        System.out.println("Selected : " + listAdded.getSelectedIndex());
}

如果未选择任何项,该方法将返回-1。如果未选择任何项,该方法将返回-1。javadoc明确指出,如果未选择任何项,该方法将返回-1

如果你认为自己不应该看到-1,那么我可以想出三种解释:

代码中的其他内容是在getSelectedIndex调用发生之前删除选择

您正在错误地访问Swing数据结构。如果尝试从事件侦听器线程以外的其他线程访问它们,则不能保证它将看到正确的状态

你不知何故误读了症状;e、 g.您在错误的对象上调用getSelectedIndex


最后一种可能性是它是一个摇摆虫。。。但在任何人打电话之前,您需要提供一个适当的SSCCE来演示问题。坦率地说,我认为这不太可能真的是一个Swing bug

javadoc明确指出,如果未选择任何项,则返回-1

如果你认为自己不应该看到-1,那么我可以想出三种解释:

代码中的其他内容是在getSelectedIndex调用发生之前删除选择

您正在错误地访问Swing数据结构。如果尝试从事件侦听器线程以外的其他线程访问它们,则不能保证它将看到正确的状态

你不知何故误读了症状;e、 g.您在错误的对象上调用getSelectedIndex


最后一种可能性是它是一个摇摆虫。。。但在任何人打电话之前,您需要提供一个适当的SSCCE来演示问题。坦率地说,我认为这不太可能真的是一个Swing bug

因为您删除了所选项目,所以没有选择被删除,返回值为-1

因为您删除了所选项目,所以没有选择被删除,返回值为-1

,我不得不使用.locationToIndex,因为.getSelectedIndex在右键单击时无法正常工作,返回-1。下面是一些工作代码:

tileSelector.addMouseListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent e) {
        // get Selected Tile
        int idx = tileSelector.locationToIndex(e.getPoint());
        tileSelector.setSelectedIndex(idx);
        if (SwingUtilities.isLeftMouseButton(e)) {
            debugOutput.append(idx + " Left Click\n");
            debugOutput.setCaretPosition(debugOutput.getDocument().getLength());
        } else if (SwingUtilities.isRightMouseButton(e)) {
            debugOutput.append(idx + " Right Click\n");
            debugOutput.setCaretPosition(debugOutput.getDocument().getLength());
        }
    }
});

就我个人而言,我不得不使用.locationToIndex,因为.getSelectedIndex在右键单击时无法正常工作,返回-1。下面是一些工作代码:

tileSelector.addMouseListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent e) {
        // get Selected Tile
        int idx = tileSelector.locationToIndex(e.getPoint());
        tileSelector.setSelectedIndex(idx);
        if (SwingUtilities.isLeftMouseButton(e)) {
            debugOutput.append(idx + " Left Click\n");
            debugOutput.setCaretPosition(debugOutput.getDocument().getLength());
        } else if (SwingUtilities.isRightMouseButton(e)) {
            debugOutput.append(idx + " Right Click\n");
            debugOutput.setCaretPosition(debugOutput.getDocument().getLength());
        }
    }
});

我保证,因为没有选择。我选择了一个列表项,它是否在第一个System.out.println中打印出-1?我的猜测是不会,否则前面的几行会抛出一个错误。因此,唯一需要假设的是,当您删除当前选中的元素时,显然不再选择任何内容,因此返回值-1。我在valueChanged事件中打印了选中的索引值。它工作正常。我没有得到任何异常。@RSST听起来你可能在隐藏你的变量。知道你做了什么,并在正确对象的正确实例上实际做了,这是另一回事。我保证,如果你的答案是a,你会得到更好的答案,因为没有选择。我选择了一个列表项,它是否在第一个System.out.println中打印出-1?我的猜测是不会,否则前面的几行会抛出一个错误。因此,唯一需要假设的是,当您删除当前选中的元素时,显然不再选择任何内容,因此返回值-1。我在valueChanged事件中打印了选中的索引值。它工作正常。我没有得到任何异常。@RSST听起来你可能在隐藏你的变量。知道你做了什么,并在正确对象的正确实例上实际做了,这是另一回事。如果你提供的答案是“我选择了一个项目”,你会得到更好的答案。它返回-1。@RSST-JVM不同意您的意见。或者更准确地说。。。在您调用该方法时,未选择任何项目。我选择了一个项目。它返回-1。@RSST-JVM不同意您的意见。或者更准确地说。。。在调用该方法时,未选择任何项。