目前,我有一个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选择时,已经太晚了。
答案 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); } } });