我有一个包含CheckBoxes的JTable。我的应用程序的构建方式是,每当编辑任何条目时,都会更改背景以显示条目处于编辑状态。我已经用鼠标对其进行了设置,但是当添加KeyListener来捕捉键盘上的空间时,只有Space已经保存较长时间时,keyReleased方法才会触发,并且复选框会快速选择和取消选择。包含JCheckBox的JTable的键监听器
当我使用keyTyped和keyPressed方法时,除了进入表中的新数据没有被捕获之外,所有的方法都行之有效。
所以,我的问题是我怎么能够捕获空间时按下表并收集表中的所有当前值?
我正在使用MVC体系结构;这是我的控制:
public class UserInternalFrameController {
UserInternalFrame gui = new UserInternalFrame();
public UserInternalFrameController(ManagementGUI mainGui) {
gui.getTableUserTransactionPermissions().addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
System.out.println("typed");
// TODO Auto-generated method stub
if (e.getKeyChar() == ' ') {
if (stateMachine == 2 || stateMachine == 4) {
JTable permTable = gui.getTableUserTransactionPermissions();
int noOfColumns = gui.getUserTransactionPermissionsHeader().length;
permListEdit = false;
for (int i = 0; i < permList.length; i++) {
for (int j = 0; j < noOfColumns; j++) {
if (!permList[i][j].equals(permTable.getValueAt(i, j))) {
System.out.println("row" + i + "; column" + j + "; perList:" + permList[i][j] + "; transList: " + permTable.getValueAt(i, j));
permListEdit = true;
}
}
}
if ((employeeCodeEdit || usernameEdit || passwordEdit || userIdEdit || subjectIdEdit || userStatusEdit || userRoleEdit || permListEdit) == false) {
gui.getPanelUser().setBackground(defaultBackgroundPanelUser);
gui.getTableUserTransactionPermissions().setBackground(Color.WHITE);
stateMachine = 2;
gui.getBtnSave().setEnabled(false);
} else {
gui.getPanelUser().setBackground(Color.decode("#f5deb3"));
gui.getTableUserTransactionPermissions().setBackground(Color.decode("#f5deb3"));
stateMachine = 4;
gui.getBtnSave().setEnabled(true);
}
}
}
}
});
}
}
相同的代码块用鼠标的ActionListener效果很好,并具有当加入到方法的keyPressed同一延迟效应。 keyReleased似乎可以很好地处理除空间以外的所有其他按钮。
我的键盘很好。
任何帮助将不胜感激。
请原谅我的无能。你是否建议我使用TableModelListener来监听表的更改?我试过以下内容:'gui.getTableUserTransactionPermissions()。getModel()。addTableModelListener(新TableModelListener(){ \t \t \t \t \t \t @Override \t \t \t公共无效tableChanged(TableModelEvent为arg0){ \t \t \t \t // TODO自动生成方法存根 \t \t \t \t的System.out .println(“TableModelListener”); \t \t \t} \t \t});'但tableChanged方法永远不会被调用......这就是为什么我使用鼠标和键监听器开始。 – greatkalu
我使用这种方法的原因是因为JTable在一个选项卡中......记录的详细信息遍布所有选项卡。如果对记录的任何选项卡进行了更改,我希望更改所有选项卡的背景以便通知用户记录处于编辑状态。另外,我必须通知我的stateMachine(这是一个正确的方法)并启用/禁用CRUD按钮。 – greatkalu
对不起,如果我暗示无能;我的意思是解决纯粹的无知,我自己包括在内。我无法解释你的'TableModelListener'问题;有一个例子[这里](http://stackoverflow.com/a/7137801/230513)。相关的标签应该观察表格的模型,而不是'JTable'视图本身。 CellEditor的生命周期在[here](http://stackoverflow.com/a/10067560/230513)中有说明。 – trashgod