JTable中删除列的问题,请高手做答,问题解决立刻给分

jiaminxy 2004-04-14 06:20:07
我在一个表的表模型里添加一列后,又通过该表的列模型删除该列。然后向表模型里增加新列并刷新界面时,被删除的那一列又显示出来了。也就是说,列模型里被删掉的列在表模型里并没有被删除,

删除列用的是:
table.getColumnModel().removeColumn(table.getColumnModel().getColumn(i));
插入列用的是
DefaultTableModel.insertColumn("insert column",new Vector(),iCurCol);

请问,如何解决这些问题
...全文
199 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
SACKings 2004-04-16
  • 打赏
  • 举报
回复
Give you an example. You can add as many colums as you can.

public class Panel extends JPanel {
private JTable table_ = new JTable();
private ButtonPanel buttonPanel_ = new ButtonPanel();

public Panel() {
JScrollPane scrollPane = new JScrollPane();
scrollPane.getViewport().add(table_);
setLayout(new BorderLayout());
add(scrollPane, BorderLayout.CENTER);
add(buttonPanel_, BorderLayout.SOUTH);
setModel();
}

private void setModel() {
Vector colums = new Vector();
colums.add("Colum1");
colums.add("Colum2");
MyTableModel tableModel = new MyTableModel(colums);
table_.setModel(tableModel);
}


private void addCol(String newColName) {
( (MyTableModel) table_.getModel()).addCol(newColName);
}

private void removeCol() {
( (MyTableModel) table_.getModel()).removeCol();
}

private class ButtonPanel extends JPanel {
private JButton addBtn_ = new JButton("Add Colum");
private JButton removeBtn_ = new JButton("Remove Colum");

ButtonPanel() {
this.setLayout(new FlowLayout());
ActionListener listener = new BtnListener();
this.add(addBtn_);
this.add(removeBtn_);

addBtn_.addActionListener(listener);
removeBtn_.addActionListener(listener);
}

class BtnListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == addBtn_)
addCol("Test");
else if (e.getSource() == removeBtn_)
removeCol();
}
}
}

private class MyTableModel
extends AbstractTableModel {
Vector value_ = null;

public MyTableModel(Vector value) {
value_ = value;
}

public void refresh() {
fireTableDataChanged();
}

public int getColumnCount() {
return value_.size();
}

public int getRowCount() {
return 0;
}

public String getColumnName(int col) {
return (String) value_.get(col);
}

public Object getValueAt(int row, int col) {
return null;
}

public boolean isCellEditable(int row, int col) {
return true;
}

public void setValueAt(Object value, int row, int col) {

}

public void removeCol() {
int lastElement = value_.size()-1;
if(lastElement < 0) return;
value_.remove(lastElement);
fireTableStructureChanged();
}

public void addCol(String newColName) {
value_.add(newColName);
fireTableStructureChanged();
}

}

}
jiaminxy 2004-04-15
  • 打赏
  • 举报
回复
楼上的 俺智慧低,你能说清楚嘛?
Joyyu 2004-04-15
  • 打赏
  • 举报
回复
需要通知你的tableModel内容更新
fireTableRowsDeleted();
fireTableDataChanged();
fireTableRowsInserted();
jiaminxy 2004-04-15
  • 打赏
  • 举报
回复
焦急的等待中.....
lovelylulu 2004-04-15
  • 打赏
  • 举报
回复
你完全可以用另外一种方法呀
fxywkj 2004-04-15
  • 打赏
  • 举报
回复
没用过,学习
SACKings 2004-04-15
  • 打赏
  • 举报
回复
You can implement your own tableModel.
jiaminxy 2004-04-15
  • 打赏
  • 举报
回复
tableModel里面有办法把删除的列彻底移除吗?
Joyyu 2004-04-15
  • 打赏
  • 举报
回复
怎么会麻烦呢?你所需要进行增删改操作的是数据对象,而单元格的字体、字色、背景色等属性怎么来显示与你的数据结构是没有关系的

举个简单的例子:
当前为一个三行两列的表,你规定第二列(或者你规定列名为“***”)的显示为粗体,背景为蓝色,其他均为默认显示。
然后,你删除数据结构中第二列数据,重新设置(tableModel.setDataVector(row , col);)
tableModel会重排表信息,并按照你所规定的要求显示数据


jiaminxy 2004-04-15
  • 打赏
  • 举报
回复
我现在不仅仅涉及每个单元格的数据,我每个单元格还有字体、字色、背景色等属性,要是这么一移动,不很麻烦吗?在显示层,怎么能让他插入的时候,别显示出以前删除的列啊,在我保存的XML串里,插入列后是不影响,最主要就是显示有问题
Joyyu 2004-04-15
  • 打赏
  • 举报
回复
那是因为你只是删除了ColumnModel中的数据,TableModel仍然保留原来的数据结构。但TableModel并没有提供这样的接口方法,你只有自己去扩展。
好的方法是将TableModel只作为显示层,你对结构的任何变动都通过操作数据层来完成
例如在删除一列数据时,需要删除row和col
((Vector)row.get(0)).removeElementAt(1);
((Vector)row.get(1)).removeElementAt(1);
col.removeElementAt(1);
dtm.setDataVector(row , col);
jiaminxy 2004-04-15
  • 打赏
  • 举报
回复
只是删除操作,删除完了,当然是可以了,
关键一插入就不行了,有高手吗?
cyouyou 2004-04-15
  • 打赏
  • 举报
回复
先不插入,删除后就更新,看看能不能删掉。
删除后更新,再插入更新,看看行吗?
要再不行,我也不会了
panpan221 2004-04-15
  • 打赏
  • 举报
回复
来学习一下
jiaminxy 2004-04-15
  • 打赏
  • 举报
回复
这个是可以删除,但是,你删除完了,再插入一列,以前删除的列就又出来了啊
Joyyu 2004-04-15
  • 打赏
  • 举报
回复
setLayout(new BorderLayout());
String[][] row = {{"111", "222"},{"333","444"}};
String[] col = {"aaa", "bbb"};
DefaultTableModel dtm = new DefaultTableModel(row, col);
JTable table = new JTable(dtm);
this.add(new JScrollPane(table), BorderLayout.CENTER);
//添加两列
dtm.addColumn("ccc");
dtm.addColumn("ddd");
//删除一列(“ccc”)
table.getColumnModel().removeColumn(table.getColumnModel().getColumn(2));
jiaminxy 2004-04-14
  • 打赏
  • 举报
回复
我不可能插入列的时候,再从XML里面读一把吧?我现在想单一的只对table进行操作,如何实现呢?
onefox 2004-04-14
  • 打赏
  • 举报
回复
试试将表数据存储容器(数组或别的……)里的列一起删掉
jiaminxy 2004-04-14
  • 打赏
  • 举报
回复
我知道不影响数据,但是,我就是想现在彻底删除了这个列,让我插入列的时候不显示出已经删除了的列,有什么办法吗?
wribluehorse 2004-04-14
  • 打赏
  • 举报
回复
通过TableColumnModel添加和删除列不会影响表格的数据,仅影响哪些显示在表格中的列。
加载更多回复(3)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧