拦截JTable的选择更改事件

问题描述:

我发现this forum thread这表明压倒一切的ListSelectionModel,以防止被选中的行。拦截JTable的选择更改事件

我想防止选择更改直到用户确认丢弃时存在用于当前选择的项目未保存的更改(外部表)。喜欢的东西:

public class confirmSelectionChange extends DefaultListSelectionModel { 
    public void setSelectionInterval(int index0, int index1) { 
     if (unsavedChanges()) { 
      super.setSelectionInterval(int index0, int index1); 
     } 
    } 

    private boolean unsavedChanges() { 
     if (noUnsavedChangesExist) { 
      return true; 
     } 

     // Present modal dialog: save, discard cancel 
     if (dialogAnswer == SAVE) { 
      // save changes 
      return true; 
     } else if (dialogAnswer == DISCARD) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

是否有可能插入的变化的ListSelectionModel中间阻挡码?是否有更好的方法来拦截选择变更事件?

我已经听他们,但变化已经由当时发生的事情。

我的最终解决方案(部分归功于this code guru)是创建一个匿名内部类,它扩展了JTable并覆盖了changeSelection()。试过单独的一类,因为我读了一些人不认为匿名内部类是良好的面向对象设计,但我需要知道的编辑状态加上我有打电话给保存/丢弃方法。无论如何,谁需要封装它是你自己的代码? ;-)

jTableMemberList = new JTable() { 
    public void changeSelection(int rowIndex, int columnIndex, boolean toggle, 
           boolean extend) { 
     // Member is being edited and they've clicked on a DIFFERENT row (this 
     // method gets called even when the selection isn't actually changing) 
     if (editModeIsActive && getSelectedRow() != rowIndex) { 
      // User was editing, now they're trying to move away without saving 
      Object[] options = {"Save", "Discard", "Cancel"}; 
      int n = JOptionPane.showOptionDialog(this, 
              "There are unsaved changes for the " 
              + "currently selected member.\n\n" 
              + "Would you like to save them?", 
              "Save changes?", 
              JOptionPane.YES_NO_CANCEL_OPTION, 
              JOptionPane.WARNING_MESSAGE, 
              null, 
              options, 
              options[0]); 

      if (n == JOptionPane.YES_OPTION) { 
       saveChanges(); 
      } else if (n == JOptionPane.NO_OPTION) { 
       discardChanges(); 
      } else { 
       // Exit without passing call on to super 
       return; 
      } 
     } 

     // make the selection change 
     super.changeSelection(rowIndex, columnIndex, toggle, extend); 
    } 
}; 

这个解决方案似乎工作到目前为止,但我还没有广泛的测试它。有可能是潜伏在此代码的黑暗角落的一个错误或疑难杂症的...

希望它可以帮助别人!

+0

很抱歉,如果这是不好的形式来问,回答和评论,但我只是想补充一点,在我的实际的程序我把上面的对话框代码,以它自己的方法,因为有其他情况,当我需要同样的保存/丢弃/取消功能(例如退出)。 – Matt 2010-06-17 20:17:56

+0

+1覆盖更改选择方法:) – 2012-09-24 02:17:53