选择之前验证JList

时间:2009-10-12 19:10:32

标签: java

目前,我有一个JList监听列表选择监听器。

private void jList1ValueChanged(javax.swing.event.ListSelectionEvent evt) {
    // When the user release the mouse button and completes the selection,
    // getValueIsAdjusting() becomes false        
    if (evt.getValueIsAdjusting()) {
        /*
          In certain situation, I may want to prevent user from selecting other
          than current selection. How can I do so?
        */
    }
}

在某些情况下,我可能希望阻止用户选择当前选择以外的选项。我怎么能这样做?

收到ListSelectionEvent时似乎为时已晚。但是,如果我想在ListSelectionEvent发生之前这样做,我不知道用户是否试图选择其他。

这是Senario之一。

JList包含项目名称列表。 因此,每当用户选择新的列表项时,我们需要从当前项目中转换View,并显示新项目。 但是,当前项目可能尚未保存。 因此,如果当前项目尚未保存,我们会要求用户确认“保存项目?” (是,否,取消) 当用户选择取消时,这意味着他想取消他的“选择另一个项目”动作。他想坚持使用当前的JList选择。 我们将在jList1ValueChanged事件句柄中弹出确认对话框。 但是当我们尝试坚持当前的JList选择时,已经太晚了。

4 个答案:

答案 0 :(得分:3)

我已经针对相同的工作流用例实现了以下内容。虽然它对我来说足够有用,但我确实希望有一种更简单,更优雅的方法,选择事件可以在继续之前被否决。如果我有时间进行调查并弄清楚我会重新发布,但它可能会被视为投资回报不值得的情况(即自定义Swing类,直接处理较低级别的鼠标/键盘事件等)。无论如何,我目前正在做的是保存最后一个好的'验证'选择,如果用户取消将来的选择,则恢复它。这无疑是最漂亮的解决方案,但它确实有效:

// save the last good (i.e. validated) selection:
private ProjectClass lastSelectedProj;

// listing of available projects:
private JList list;

// true if current selected project has been modified without saving:
private boolean dirty;

list.addListSelectionListener(new ListSelectionListener() {
    public void valueChanged(ListSelectionEvent evt) {

    if (evt.getValueIsAdjusting()) return;

    // first validate this selection, and give the user a chance to cancel.
    // e.g. if selected project is dirty show save: yes/no/cancel dialog.
    if (dirty) {
        int choice = JOptionPane.showConfirmDialog(this,
            "Save changes?",
            "Unsaved changes",
            JOptionPane.YES_NO_CANCEL_OPTION,
            JOptionPane.WARNING_MESSAGE);

        // if the user cancels the selection event revert to previous selection:
        if (choice == JOptionPane.CANCEL_OPTION) {
            dirty = false; // don't cause yet another prompt when reverting selection
            list.setSelectedValue(lastSelectedProj, true);
            dirty = true;  // restore dirty state. not elegant, but it works.
            return;
        } else {
            // handle YES and NO options
            dirty = false;
        }
    }

    // on a validated selection event:
    lastSelectedProj = list.getSelectedValue();

    // proceed to update views for the newly selected project...
}
}

答案 1 :(得分:0)

我认为您需要覆盖JList的setSelectionInterval(...)方法,以便在您的特殊情况下不执行任何操作。

在事件级别处理它已经太晚了,因为事件已经发生。

答案 2 :(得分:0)

我建议您实施自定义ListSelectionModel

答案 3 :(得分:0)

  table.setSelectionModel(new DefaultListSelectionModel(){

   @Override
   public void setSelectionInterval(int index0, int index1) {

    if (dragState==0 && index0==index1 && isSelectedIndex(index0)) {
     // Deny all clicks that are one row & already selected
     return;
    } else {
     super.setSelectionInterval(index0, index1);
    }
   }

  });