Java 始终从DefaultTableModel中删除最后一行,而不考虑索引

Java 始终从DefaultTableModel中删除最后一行,而不考虑索引,java,swing,jtable,row,defaulttablemodel,Java,Swing,Jtable,Row,Defaulttablemodel,在java中尝试从表中删除行时,我会遇到一些问题。特别是,我使用DefaultTableModel,当我试图删除一行时,使用removeow(int row)方法,最后一行被删除,而不管行是什么。例如,假设我们有六行。调用removeRow(0)或removeRow(2)或removeRow(5)时,始终删除最后一行。知道为什么会这样吗 谢谢 ---更新 按下jtable的特定单元格时,应删除相应的行 class TagsTableMA extends MouseAdapter {

在java中尝试从表中删除行时,我会遇到一些问题。特别是,我使用
DefaultTableModel
,当我试图删除一行时,使用
removeow(int row)
方法,最后一行被删除,而不管
行是什么。例如,假设我们有六行。调用
removeRow(0)
removeRow(2)
removeRow(5)
时,始终删除最后一行。知道为什么会这样吗

谢谢

---更新

按下jtable的特定单元格时,应删除相应的行

    class TagsTableMA extends MouseAdapter {

    @Override
    public void mousePressed(MouseEvent e){
        Point p = e.getPoint();
        int row = tagsJT.rowAtPoint(p);
        int column = tagsJT.columnAtPoint(p);

        if (column == COLUMN_DELETE_TAG){
            DocDialog docDialog = new DocDialog(parentMainJF, 
                                                true, 
                                                null, 
                                                "Please confirm...", 
                                                "Are you sure you want to delete the \"" + 
                                                tagsJT.getValueAt(row, COLUMN_TAG_NAME) +
                                                "\" tag?",
                                                DocDialog.TYPE_YES_NO);
            docDialog.show();
            int answer = docDialog.getAnswer();

            if (answer == DocDialog.YES)                                                
                    model.removeRow(row);
        }
    }   
}
---更新编号2 这里是一些代码与我的问题。我删除了一些无关的东西

import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class MainJF extends JFrame {

public MainJF(){
    this.add(createTagsTable());
    setMinimumSize(new java.awt.Dimension(200,400));
}

 private JTable createTagsTable(){

    String[] columnNames = {"",          
                            "Tag",
                            "",
                            "",
                            ""};


    Object[][] data = new Object[10][columnNames.length];
    for (int i=0; i<data.length; i++){
        data[i][COLUMN_CHECK] = false;
        data[i][COLUMN_TAG_NAME] = "Tag " + i;
        data[i][COLUMN_TAG_ID] = i;
        data[i][COLUMN_EDIT_TAG] = "edit";
        data[i][COLUMN_DELETE_TAG] = "delete";
    }

    model = new TagsSelectionTableModel(columnNames, data);
    tagsJT = new JTable(model);

    tagsJT.setRowSelectionAllowed(true);
    tagsJT.addMouseListener(new TagsTableMA());

    return tagsJT;
}


class TagsSelectionTableModel extends DefaultTableModel{

    public TagsSelectionTableModel(String[] columnNames, Object[][] data){
        super(data, columnNames);
        this.columnNames = columnNames;
        this.data = data;
    }

    private String[] columnNames;
    private Object[][] data;


    @Override
    public Object getValueAt(int row, int col) { return data[row][col]; }
}

  class TagsTableMA extends MouseAdapter{

    @Override
    public void mousePressed(MouseEvent e){
        Point p = e.getPoint();
        int row = tagsJT.rowAtPoint(p);
        int column = tagsJT.columnAtPoint(p);

        if (column == COLUMN_DELETE_TAG){
            int irow = tagsJT.convertRowIndexToView(row);     
            model.removeRow(irow);
        }
    }
}


private JTable tagsJT;
private TagsSelectionTableModel model;   

private static int COLUMN_CHECK = 0;
private static int COLUMN_TAG_NAME = 1;
private static int COLUMN_TAG_ID = 2;
private static int COLUMN_EDIT_TAG = 3;
private static int COLUMN_DELETE_TAG = 4;


public static void main(String args[]) {
    new MainJF().setVisible(true);
}
}
导入java.awt.Point;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.JFrame;
导入javax.swing.JTable;
导入javax.swing.table.DefaultTableModel;
公共类MainJF扩展了JFrame{
公共MainJF(){
this.add(createTagsTable());
setMinimumSize(新java.awt.Dimension(200400));
}
私有JTable createTagsTable(){
字符串[]columnNames={“”,
“标签”,
"",
"",
""};
Object[][]数据=新对象[10][columnNames.length];

对于(int i=0;i查看
DefaultTableModel
removeRow(int)
方法的代码,很明显,它将删除备份
向量的相应索引处的行数组:

 public void removeRow(int row) {
    dataVector.removeElementAt(row);
    fireTableRowsDeleted(row, row);
} 
(来自Java6)

我可以想到两种可能性:

  • 您已经扩展了
    DefaultTableModel
    ,并更改了此方法的实现。(我怀疑情况是否如此-您可能会在您的帖子中承认这一点)

  • 您有一个表的自定义渲染器,它根据单元格的行索引绘制单元格数据


  • 查看
    DefaultTableModel
    removeRow(int)
    方法的代码,很明显,它将删除备份
    向量的相应索引处的行数组:

     public void removeRow(int row) {
        dataVector.removeElementAt(row);
        fireTableRowsDeleted(row, row);
    } 
    
    (来自Java6)

    我可以想到两种可能性:

  • 您已经扩展了
    DefaultTableModel
    ,并更改了此方法的实现。(我怀疑情况是否如此-您可能会在您的帖子中承认这一点)

  • 您有一个表的自定义渲染器,它根据单元格的行索引绘制单元格数据


  • columnAtPoint()
    获取的
    位于视图坐标中,而
    removeRow()
    采用模型坐标。引用相关:

    除非通过对列进行排序、筛选或用户操作来重新排列查看的数据,否则这种区别并不重要

    如果是这样,您将需要使用的
    convertRowIndexToModel()
    (在的末尾描述),它建议:

    使用分拣机时,请始终记住转换单元坐标

    也可以考虑使用A而不是<代码> MouseAdapter < /代码> ./P> 附录:

    getValueAt()
    的实现继续访问提供给构造函数的数组,而模型的数据实际上存储在父实现中。如果确实需要对模型的数据结构进行更多控制,请扩展
    AbstractTableModel
    ,如图所示

    导入java.awt.EventQueue;
    导入java.awt.Point;
    导入java.awt.event.MouseAdapter;
    导入java.awt.event.MouseEvent;
    导入javax.swing.JFrame;
    导入javax.swing.JScrollPane;
    导入javax.swing.JTable;
    导入javax.swing.table.DefaultTableModel;
    /**@见https://stackoverflow.com/a/11237205/230513 */
    公共类MainJF扩展了JFrame{
    私有JTable标记;
    私有标记选择表模型;
    私有静态int列检查=0;
    私有静态int列\标记\名称=1;
    私有静态int列\标记\ ID=2;
    私有静态整型列\编辑\标记=3;
    私有静态int列_DELETE_TAG=4;
    公共MainJF(){
    add(新的JScrollPane(createTagsTable());
    包装();
    setLocationRelativeTo(空);
    setDefaultCloseOperation(关闭时退出);
    }
    私有JTable createTagsTable(){
    字符串[]columnNames={“0”、“标记”、“2”、“3”、“4”};
    Object[][]数据=新对象[10][columnNames.length];
    对于(int i=0;i
    columnAtPoint()
    获取的
    位于视图坐标中,而
    removeRow()
    采用模型坐标。引用相关: