2011-05-08 49 views
2

我是新來的java,所以我的知識是相當有限的。如果我忽略了一些相當明顯的解決方案,我現在已經想找藉口了。如何通過雙擊刪除行?

我在嘗試在我的程序中創建函數時出現問題,因此用戶可以通過雙擊它來刪除一行(從JTable)。我試圖用這個代碼:

public void mouseClicked(MouseEvent e) { 
    if (e.getClickCount() == 2) { 
     JTable target = (JTable)e.getSource(); 
     int deletedRow = target.getSelectedRow(); 
      myTableModel.removeRow(deletedRow); 

      myTableModel.fireTableDataChanged(); 
     } 
    } 

myTableModelAbstractTableModel延伸。我希望你們中的一些人能夠幫助我。

+0

會發生什麼情況?你有例外嗎? – Kaj 2011-05-08 18:06:01

+0

我根本沒有得到任何反應。 也許我應該補充一點,我的表名爲jTable1,它是名爲myTableModel的模型。 jTable1.setModel(myTableModel); – Viktor 2011-05-08 18:22:04

+0

你在調試器中執行過它嗎?你確定你正在進入該塊,並且deletedRow正在返回一個有效的行嗎? – Kaj 2011-05-08 18:28:29

回答

2

myTableModel從AbstractTableModel擴展而來。

我不知道這意味着什麼。我假設它意味着你正在使用DefaultTableModel,因爲它實現了removeRow(...)方法。

不需要調用fireTableDateChanged()方法。 DefaultTableModel的removeRow()方法將爲你做到這一點。調用這些方法是TableModel的責任,而不是您的自定義代碼。

你正在執行的方法?默認情況下雙擊並調用雙擊單元格的編輯器。所以你需要重寫表的isCellEditable(...)方法來返回false。然後在表上調用雙擊並調用你的監聽器代碼。

在您訪問表,所以你應該從表中的模型,以確保您正在訪問正確的型號您的事件代碼

另外:

DefaultTableModel model = (DefaultTableModel)table.getModel(); 

如果您需要更多的幫助(和未來當你發佈一個問題時),然後發佈你的SSCCE,因爲我們不能根據幾行代碼猜測你在做什麼。

+0

對不起。它是DefaultTableModel。我有點困惑。 很高興知道我不必調用fireTableDateChanged。 我的方法沒有被執行,至少Netbeans在雙擊一行時沒有顯示任何活動的跡象。 我真的不知道你重寫isCellEditable。到目前爲止,我有:'code'public boolean isCellEditable(int rowIndex,int columnIndex){ return false; } 我應該在它之前放一個@Override嗎? – Viktor 2011-05-08 18:33:04

+2

如果您的事件代碼沒有被執行,您需要發佈您的SSCCE。我無法猜測你的代碼是什麼樣的。 – camickr 2011-05-08 18:56:13

1
int c = evt.getClickCount(); 
    if (c == 2) { 
     int res = JOptionPane.showConfirmDialog(null, "Are you sure to delete this data?", "", JOptionPane.YES_NO_OPTION); 
     switch (res) { 
      case JOptionPane.YES_OPTION: 
      int p = table.getSelectedRow(); 
      DefaultTableModel model = (DefaultTableModel) table.getModel(); 
      model.removeRow(p); 
      JOptionPane.showMessageDialog(null, "Delete Successfully"); 
      break; 
      case JOptionPane.NO_OPTION: 
      JOptionPane.showMessageDialog(null, "Delete Action is Canceled"); 
      break; 
     } 

    }