2011-05-08 51 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; 
     } 

    }