2010-06-17 118 views
3

我發現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中間阻擋碼?是否有更好的方法來攔截選擇變更事件?

我已經聽他們,但變化已經由當時發生的事情。

回答

2

我的最終解決方案(部分歸功於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