【问题标题】:remove rows from JTable with AbstractTableModel使用 AbstractTableModel 从 JTable 中删除行
【发布时间】:2023-03-04 11:38:02
【问题描述】:

我想使用按钮从JTableAbstractTableModel 中删除选定的行。

以下代码适用于 DefaultTableModel:

...
MyTableModel mtb;
...
private String[]....
private Object[][]...
...
JTable table = new JTable(mtb)
JButton delete;
...
 public void actionPerformed(ActionEvent e) {

        if(e.getSource().equals(delete))
         {
                 if(table.getSelectedRow()<0)
                 {
                  JOptionPane.showMessageDialog(this,"Select row");

                 }
                 else
                 {
                     mtb.removeRow(table.getSelectedRow()); 

                 }
         }
     }

但它不适用于AbstractTablemodel

我的代码有点乱,所以这里是来自 oracle 页面的java example 可以使用:

谢谢!

【问题讨论】:

  • 它不起作用,因为该方法未定义。只需将这样的方法添加到您的 TableModel 并确保该方法触发正确的事件。请注意,您问题中的代码与提出解决方案无关。我们需要您的 TableModel iso 和 actionPerformed 方法来提供有用的建议
  • 好的,我认为在 DefaultTableModel 中有一个类似的定义方法,但现在我知道我需要定义它。谢谢。

标签: java swing user-interface jtable abstracttablemodel


【解决方案1】:

对于AbstractTableModel,您必须根据模型的内部数据结构实现自己的removeRow(),但您可以研究DefaultTableModel 的来源作为触发事件的指南。例如,

public void removeRow(int row) {
    // remove a row from your internal data structure
    fireTableRowsDeleted(row, row);
}

【讨论】:

  • 我找到了更相关的提示:“向现有数组添加数据并不容易,您必须创建一个比旧数组更大的新数组,复制所有数据,然后添加新项目。最好使用 Vector 或 ArrayList。"
  • 我找到了更相关的提示我们的魔法水晶球可能未能揭示您使用数组作为内部数据结构。 +1 为这个答案,这是关于问题中可用信息的最佳答案
  • 虽然没有被弃用,Vector 是一个遗留类。考虑对接口进行编码,例如List&lt;Row&gt;,可让您根据需要更改实现
【解决方案2】:

DefaultTableModel 将在表模型发生变化时自行调用fireXX 方法。但是如果我们使用AbstractTableModel,那么我们必须显式调用fireXX 方法。因此,当表格发生变化时,只需调用相关的fireXX 方法。

为了,

插入一个新行到表中使用fireTableRowsInserted

删除(在你的情况下)使用fireTableRowsDeleted

更新使用fireTableRowsUpdated

注意: DefaultTableModel 实现了大部分方法。所以除非真的需要AbstractTableModel,否则坚持使用DefaultTableModel

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2014-10-09
    相关资源
    最近更新 更多