【问题标题】:How to delete row by double-clicking?如何通过双击删除行?
【发布时间】:2011-08-21 05:11:51
【问题描述】:

我是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();
        } 
     }

myTableModel 扩展自 AbstractTableModel。我希望你们中的一些人能够帮助我。

【问题讨论】:

  • 会发生什么?你有例外吗?
  • 我一点反应都没有。也许我应该补充一点,我的表叫做 jTable1,它的模型叫做 myTableModel。 jTable1.setModel(myTableModel);
  • 你在调试器中执行了吗?您确定您正在输入块并且 deletedRow 正在返回有效行吗?
  • Netbeans 调试器发现没有问题

标签: java swing jtable double-click


【解决方案1】:

myTableModel 扩展自 AbstractTableModel。

我不知道那是什么意思。我认为这意味着您使用的是 DefaultTableModel,因为它实现了 removeRow(...) 方法。

无需调用 fireTableDateChanged() 方法。 DefaultTableModel 的 removeRow() 方法将为您执行此操作。调用这些方法是 TableModel 的职责,而不是您的自定义代码。

你的方法正在执行吗?默认情况下,双击调用您双击的单元格的编辑器。因此,您需要覆盖表的 isCellEditable(...) 方法以返回 false。然后将在表上调用双击并调用您的侦听器代码。

您还可以在事件代码中访问表格,因此您应该从表格中获取模型以确保您访问的是正确的模型:

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

如果您需要更多帮助(以及将来发布问题时),请发布您的 SSCCE,因为我们无法根据几行代码猜测您在做什么。

【讨论】:

  • 是的,抱歉。它是 DefaultTableModel。我有点困惑。很高兴知道我不必调用 fireTableDateChanged。我的方法没有被执行,至少当我双击一行时,Netbeans 没有显示任何活动迹象。通过覆盖 isCellEditable,我真的不知道你是什么。到目前为止,我有:'code'public boolean isCellEditable(int rowIndex, int columnIndex) { return false;我应该在它前面放一个@Override 吗?
  • 如果您的事件代码没有被执行,您需要发布您的 SSCCE。我猜不出你的代码是什么样子的。
【解决方案2】:
 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;
        }

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2018-10-02
    • 2014-09-27
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    相关资源
    最近更新 更多