【问题标题】:When I choose item in jList and use getSelectedIndex() it returns -1当我在 jList 中选择项目并使用 getSelectedIndex() 它返回 -1
【发布时间】:2015-04-16 20:25:15
【问题描述】:

我正在尝试创建一个 ToDoList ,并创建一个 jButton 以从 Database 中删除一个任务,当我检查 index 它总是给出 (-1)

        if (jListTasks.getSelectedIndex() == -1) {
            JOptionPane.showMessageDialog(null, "No task selected!!");
        } else {
            JOptionPane.showConfirmDialog(null, "Are you sure?!", "Remove task", JOptionPane.YES_NO_OPTION);}

更新:

//      set DefaultListModel
        tasksListModel = new DefaultListModel();
        jListTasks.setModel(tasksListModel);

然后我创建这个方法

// to clear and fill list every time method invoked
    private void fillTaskList() {

        tasksListModel.clear();
        try {
            resultSet = pstmt.executeQuery();
            while (resultSet.next()) {
//                System.out.println("xxx");
                tasksListModel.addElement("\"" + resultSet.getString("task_name") +
                        "\"" + " starts at " + resultSet.getString("start_time"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(ToDoFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

这是RemoveButton中的ActionListener

jbtnRemoveTask.addActionListener((ActionEvent e) -> {
// to fill the list with latest values in database
            sqlQuery = "SELECT * FROM tasks";
            try {
                pstmt = connection.prepareStatement(sqlQuery);
                fillTaskList();
            } catch (SQLException ex) {
                Logger.getLogger(ToDoFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
// to restore the Frame to default size as I change size during the using of application
            if (ToDoFrame.this.getSize().width > 515 || ToDoFrame.this.getSize().height > 440) {
// implementation for these two methods comes at the end
                decreaseHeight();
                decreaseWidth();
            }
//          System.out.println(jListTasks.getLastVisibleIndex());
//          System.out.println(jListTasks.getSelectedIndex());

// this code is always executed even there is item selected
            if (jListTasks.getSelectedIndex() == -1) {
                JOptionPane.showMessageDialog(null, "No task selected!!");
            } else {
                JOptionPane.showConfirmDialog(null, "Are you sure?!", "Remove task", JOptionPane.YES_NO_OPTION);
                try {
//                  System.out.println(jListTasks.getSelectedValue());
                    String s = jListTasks.getSelectedValue().toString();
                    s = s.substring(s.length() - 5);
//                    System.out.println(s);
// the code for updating database
                    sqlUpdate = "DELETE FROM tasks WHERE start_time = ?";
                    pstmt = connection.prepareStatement(sqlUpdate);
                    pstmt.setString(1, s);
                    pstmt.executeUpdate();
                    JOptionPane.showMessageDialog(null, "Task removed successfully!");
                    sqlQuery = "SELECT * FROM tasks";
                    pstmt = connection.prepareStatement(sqlQuery);
                    fillTaskList();
                } catch (SQLException ex) {
                    Logger.getLogger(ToDoFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        });

// here are the code of decreaseWidth and decreaseHeight methods
private void decreaseWidth() {

    for (int i = ToDoFrame.this.getSize().width; i > 510; i -= 10) {
        ToDoFrame.this.setSize(i, ToDoFrame.this.getSize().height);
        ToDoFrame.this.setLocationRelativeTo(null);
        try {
            Thread.sleep(20);
        } catch (InterruptedException ex) {
            Logger.getLogger(ToDoFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

 private void decreaseHeight() {

    for (int i = ToDoFrame.this.getSize().height; i > 435; i -= 10) {
        ToDoFrame.this.setSize(ToDoFrame.this.getSize().width, i);
        ToDoFrame.this.setLocationRelativeTo(null);
        try {
            Thread.sleep(20);
        } catch (InterruptedException ex) {
            Logger.getLogger(ToDoFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

注意:在直接在 ActionListener 内部进行调整大小时,代码在调整 Frame 大小的方法之前运行良好

感谢您的帮助

【问题讨论】:

  • 请提供更多代码。
  • 实际选择了什么?
  • 很高兴看到jListTasks 是如何被填充的
  • 还要看看那个 jbutton 动作会发生什么。
  • 发生了两种情况之一:1) 用户没有选择列表中的任何内容,或者 2) 您没有对 GUI 上可见的 JLIst 的引用。由于您没有针对您的问题发布正确的SSCCE,我们无法为您提供更多建议。

标签: java swing jlist defaultlistmodel


【解决方案1】:

看起来您的删除按钮的操作侦听器在检索所选索引之前调用了fillTaskList 方法。待办事项列表的重新填充将清除列表中的选择,并且对 jListTasks.getSelectedIndex() 的调用将返回 -1。

我认为您只需要在删除所选项目后更新待办事项列表。

【讨论】:

  • 谢谢你,我会试试看的:) 我认为你是对的
  • 如果我在一个线程中这样做,你认为它会解决问题吗??
  • 我认为这不会有帮助。删除待办事项列表第一次更新的代码(使用 try-catch 选择“SELECT * FROM 任务”)似乎是我最好的解决方案。在您要删除项目时更新列表并不是很有帮助,因此删除此代码应该会使您的程序更短并且可以正常工作。
  • 如果您想在删除之前进行更新,您可以先保存要删除的项目的索引。之后,您可以更新列表,使用保存的索引进行删除,然后再次更新列表。
猜你喜欢
  • 2016-04-02
  • 2016-01-01
  • 1970-01-01
  • 2016-11-25
  • 2011-09-08
  • 2010-12-21
  • 2012-02-29
  • 1970-01-01
  • 2021-09-29
相关资源
最近更新 更多