import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class TableUse extends JFrame {
DefaultTableModel dt;
JTable table;
public TableUse()
{
super("表格的使用");
Container c= getContentPane();
c.setLayout(new FlowLayout());
//创建四个按钮
JButton []b={
new JButton("添加行"),new JButton("添加列"),
new JButton("删除行"),new JButton("删除列")
};
//通过for循环把按钮添加到容器c上
for(int i=0;i<b.length;i++)
{
c.add(b[i]);
}
//创建一个空的数据表格
dt=new DefaultTableModel();
//通过数据模型创建表格
table=new JTable(dt);
//设置表格显示区域的大小
table.setPreferredScrollableViewportSize(new Dimension(360, 160));
//设置表格列宽在表格缩放时自动调整模式
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
//添加滚动窗格
JScrollPane span = new JScrollPane(table);
c.add(span);
//对按钮添加注册监听器
b[0].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//调用方法
addRow();
System.out.println("添加了一行");
}
});
b[1].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
addColumn();
System.out.println("添加了一列");
}
});
b[2].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
deleteRow();
System.out.println("删除了当前行");
}
});
b[3].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
deleteColumn();
System.out.println("删除了当前列");
}
});
}
//该方法用于添加一列
public void addColumn()
{
//获得二维表格的列数
int cNum = dt.getColumnCount();
//获得二维表格的行数
int rNum = dt.getRowCount();
String s="列"+(cNum+1);
//返回第一个选定值的索引值
int c = table.getSelectedColumn();
System.out.println("当前列号为:"+c);
if(cNum==0||rNum==0||c<0){
dt.addColumn(s);
return;
}
c++;
//调用方法对表头进行处理
Vector<String> vs =getColumnNames();
vs.add(c,s);
Vector data =dt.getDataVector();
for(int i=0;i<data.size();i++)
{
Vector e =(Vector)data.get(i);
e.add(c,new String(" "));
}
dt.setDataVector(data, vs);
}
//该方法用于添加一行
public void addRow()
{
int cNum = dt.getColumnCount();
if(cNum==0)
addColumn();
int rNum = dt.getRowCount();
int r = getRowCurrent();
System.out.println("当前的行号为:"+r);
dt.insertRow(r, (Vector)null);
}
//该方法用于删除一列
public void deleteColumn()
{
int cNum =dt.getColumnCount();
if(cNum==0)
return;
int c= table.getSelectedColumn();
if(c<0)
c=0;
System.out.println("当前列号为:"+c);
//调用方法对表头的列名进行处理
Vector<String> vs =getColumnNames();
vs.remove(c);
Vector data = dt.getDataVector();
for(int i=0;i<data.size();i++)
{
Vector e=(Vector) data.get(i);
e.remove(c);
}
dt.setDataVector(data, vs);
}
//该方法用于删除一行
public void deleteRow(){
int rNum = dt.getRowCount();
if(rNum>0)
{
int rEdit = getRowCurrent();
dt.removeRow(rEdit);
}
}
//该方法用于取得列的名字
public Vector<String> getColumnNames(){
Vector<String> vs = new Vector<String>();
int cNum = dt.getColumnCount();
for(int i=0;i<cNum;i++)
vs.add(dt.getColumnName(i));
return (vs);
}
//该方法用于取得当前行的行号
public int getRowCurrent(){
int r = table.getSelectedRow();
if(r<0)
r=0;
return(r);
}
public static void main(String[] args) {
TableUse app = new TableUse();
app.setSize(360, 260);
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setVisible(true);
}
}
------解决思路----------------------
个人浅见:
Vector<String> vs = getColumnNames();
vs.add(c, s);
Vector data = dt.getDataVector();
for (int i = 0; i < data.size(); i++) {
Vector e = (Vector) data.get(i);
e.add(c, new String(" "));
}
dt.setDataVector(data, vs);
上面这段代码的目的是向表添加新的列,前两行
Vector<String> vs = getColumnNames();
vs.add(c, s);
向表头向量增加表头名,比如你要在第2列后增加一列,在位置2增加一个字符串。
余下的行
Vector data = dt.getDataVector();
for (int i = 0; i < data.size(); i++) {
Vector e = (Vector) data.get(i);
e.add(c, new String(" "));
}
向新增的列插入空字符串。data本身是个向量(Vector),它的大小正好是表的行数,而data里面的每个元素也是一个代表一行的向量,当要插入一列时,是每一行都要插入一列,这个循环就是完成这个工作。如果没有上述循环,则新加的列会加在最后。不是在当前插入了。楼主可以测试一下。
后面的删除列正好相反。
------解决思路----------------------
有变化的。e.add(c, new String(" "));效果

e.add(c, new String(" ddasd"));效果
