JTable得单元格(cell)在渲染得时候使用得是默认得DefaultTableCellRenderer。其返回的Component是继承了 JLabel得组件,所以直接使用默认得渲染器对其内容的更改显得力不从心。其监听主要在他得CellEditor上面JTable使用的默认得编辑器为 JTextField,这样你就可以重新添加编辑器即继承DefaultCellEditor然后给其添加一定得监听事件后在对jtable添加编辑器, 单这样做我感觉过于过于繁琐。在单元格进行编辑的时候会触发TablechangEvent 事件,Tablechange事件提供了几种触发事件得类型主要分为:
1.insert
2.update
3.delete
如果要对其某个单元格得内容是否真得发生了更改得话只有选择update类型,但其监听得事件是在你双击进入编辑状态后不管有没有对数据进行更改都会触发 此事件。如果我们能获得进入编辑状态前和编辑状态完成后得内容是很容易确定其内容是否真得进行过更改得。
首先对Jtable添加TableModelListener方法如下
dtm.addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
// TODO Auto-generated method stub
if(e.getColumn()==0){
String msg=dtm.getValueAt(e.getLastRow(),e.getColumn()).toString().trim();
dtm.setValueAt(productpeopleservice.getDepartmentNameByUsername(msg), e.getLastRow(), e.getColumn()+1);}//通过改变某一单元格对另一单元格进行赋值
}
});
这样就可以对其是否进入过编辑状态有了监听,然后在给其添加mouselistener就可以对其进去编辑状态前得情况进行记录
t.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
//记录进入编辑状态前单元格得数据
oldvalue = t.getValueAt(t.getSelectedRow(),t.getSelectedColumn()).toString();
}
});
下面是对table的一系列重写的方法,有些可能会有用,代码只是片段,
muserservice=new AccountManagerServices();
JTableHeader tableH;
String time="";
p_ptable.getColumnModel().getColumn(1).setPreferredWidth(100);
p_ptable.getColumnModel().getColumn(10).setPreferredWidth(110);
tableH = p_ptable.getTableHeader();
//设置表头的背景色
tableH.setBackground(Color.gray);
tableH.setForeground(Color.blue);
tableH.setFont(new Font("楷体",Font.BOLD,14));
JComboBox<String>username=new JComboBox<String>();
//对username下拉框进行赋值**如果想通过jcombox对其他数据进行更改不能再combobox中设置事件否则会出现越界错误。只能添加dtm监听事件
for(String name:muserservice.getUsername()){
username.addItem(name);
}
TableColumn columnuser=p_ptable.getColumn("项目人");
columnuser.setCellEditor(new DefaultCellEditor(username));//将项目人更改为jcombobox下拉框
JComboBox<String>isend=new JComboBox<String>();
isend.addItem("是");
isend.addItem("否");
TableColumn column=p_ptable.getColumn("是否完成");
column.setCellEditor(new DefaultCellEditor(isend));
//对时间列进行赋值,如果选中为空,则取原来的时间
final JTextField date1=new JTextField();
date1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(java.awt.event.MouseEvent e) {
SelfCalendar selfCalendar = new SelfCalendar(new JTextField());
String time = selfCalendar.gettime;
int row=p_ptable.getSelectedRow();
int col=p_ptable.getSelectedColumn();
String s=p_ptable.getValueAt(row, col).toString().trim();
if(time==null||time==""){
time=s;
}
date1.setText(time);
}
});
TableColumn columndate1=p_ptable.getColumn("开始日期");
columndate1.setCellEditor(new DefaultCellEditor(date1));
TableColumn columndate2=p_ptable.getColumn("结束日期");
columndate2.setCellEditor(new DefaultCellEditor(date1));
TableColumn column1=p_ptable.getColumn("加班(H)");
TableColumn column2=p_ptable.getColumn("休假(H)");
TableColumn column3=p_ptable.getColumn("产值");
TableColumn column4=p_ptable.getColumn("日加班费");
TableColumn column5=p_ptable.getColumn("日补金额");
DefaultTableCellRenderer fontColor = new DefaultTableCellRenderer() {
public void setValue(Object value) { //重写setValue方法,从而可以动态设置列单元字体颜色
String a = (value instanceof String) ? (String)value : "0"; //获取加班列的值
setForeground(!Match.isDouble(a) ? Color.red : Color.black); //如果不是double数据,就将字体设置为红色
setText((value == null) ? "0" : value.toString());
}
};
column1.setCellRenderer(fontColor);
column2.setCellRenderer(fontColor);
column3.setCellRenderer(fontColor);
column4.setCellRenderer(fontColor);
column5.setCellRenderer(fontColor);