当前位置: 代码迷 >> J2SE >> (求解答)研究JTable 中 有一段代码(红色标记处)不懂 求大牛给解释一下。该怎么解决
  详细解决方案

(求解答)研究JTable 中 有一段代码(红色标记处)不懂 求大牛给解释一下。该怎么解决

热度:154   发布时间:2016-04-23 19:41:27.0
(求解答)研究JTable 中 有一段代码(红色标记处)不懂 求大牛给解释一下。。。
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"));效果
  相关解决方案