我有一个包含CheckBoxes的JTable。我的应用程序以这样的方式构建:无论何时编辑任何条目,背景都会更改,以便显示条目处于编辑状态。我已经使用鼠标进行了设置,但是当添加KeyListener来捕获键盘上的空格时,keyReleased方法仅在Space保持较长时间时触发,并且复选框选择并快速取消选择。
当我使用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似乎适用于除空格之外的所有其他按钮。
我的键盘很好。
非常感谢任何帮助。
答案 0 :(得分:3)
如此example所示,并在此tutorial中进行了讨论,类型为Boolean.class
的表列的默认呈现器和编辑器为JCheckBox
。复选框的默认鼠标处理程序正常工作,默认Key Binding是空格键。 UIManager
属性Table.selectionBackground
将以设计者首选并且用户期望的方式突出显示所选单元格。
我建议您放弃显示的方法并使用默认值。
答案 1 :(得分:1)
问题的答案很简单。一个新手的错误。这是我如何在数据检索上更新表格的片段(来自MVC模式的控制器; gui是视图实例)。
// update tableUserSearchResult
gui.setUserSearchTableData(tempList);
gui.setUserSearchResultTableModel(new DefaultTableModel(
gui.getUserSearchTableData(), gui.getUserSearchTableHeader()));
gui.getTableUserSearchResult().setModel(gui.getUserSearchResultTableModel());
我真的不知道为什么创建新的DefaultTableModel
实例会导致此错误,因为我将表的模型定义并设置为新实例。我想是......
但是,通过使用setDataVector
的{{1}}方法,我可以正确更新DefaultTableModel
(不创建)新实例,并且它可以正常工作:
DefaultTableModel
这是我在视图中声明对象的方式:
gui.setUserRolePermissionsData(userRolePermissionList);
gui.getUserRolePermissionsTableModel().setDataVector(
gui.getUserRolePermissionsData(), gui.getUserRolePermissionsHeader());
gui.getTableUserRolePermissions().setModel(gui.getUserRolePermissionsTableModel());