问题描述:
一般这种情况不会显示报错,但debug起来时你会发现grabFocus()方法的是不能定位焦点的,用hasFocus()方法来验证,会发现boolean为false。
原因分析:
1.因为我在基础页面做定位焦点操作时是可以获取到焦点的,而且相同的操作写在新页面的查询方法中也可以实现,说明在初始化定位焦点过程中初始化表格并没有完成渲染,确保页面渲染的线程完成后再进行定位操作即可。
2.其他原因:建议尽量少使用setEnabled(false)这种设置表格不可编辑的方式,因为有可能也会导致表格不但不可编辑,而且不可选中,更建议使用DefaultTableModel;
解决方法:
1.再开启一个线程,设置休眠时间,专门用来做初始化页面的焦点定位,提示:定位之后若无徐其他操作及时关闭线程,避免线程池占用以及线程冲突,示例代码如下:
final TTable tb1 = (TTable) this.getComponent("TABLE");
new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
//super.run();
try {
Thread.sleep(1*100);
} catch (InterruptedException e) {
e.printStackTrace();
}
tb.grabFocus();
if(row >= 0){
table.setSelectedRow(row);
}else{
table.setSelectedRow(0);
}
//为DeptTable设置键盘监听
tb1.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e) {
int count = table.getRowCount();
//当按中向下方向键时,焦点下移
if (e.getKeyCode()==38) {
int row = table.getSelectedRow() - 1;
if (row < 0)
row = 0;
table.grabFocus();
table.setSelectedRow(row);
}else if(e.getKeyCode()==40){
//当按中向上方向键时,焦点上移
int row = table.getSelectedRow() + 1;
if (row >= count)
row = count - 1;
table.grabFocus();
table.setSelectedRow(row);
}else if (e.getKeyCode()==10) {
//当按中回车键时。去除键盘监听时间,并且触发表格点击事件,并将焦点转移至收费
tb1.removeKeyListener(this);
onBedTable();
}else{
}
}
});
}
}.start();
2.更建议使用DefaultTableModel方式来实现不可编辑的效果。
DefaultTableModel tablemodel = new DefaultTableModel(15,1);
table = new JTable(tablemodel ){
public boolean isCellEditAble(int row,int column){
return false;
}
};
如果有其他好的方式,还请大牛们分享一下,虚心求教。