Java 始终从DefaultTableModel中删除最后一行,而不考虑索引
在java中尝试从表中删除行时,我会遇到一些问题。特别是,我使用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 {
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()
采用模型坐标。引用相关: