2012-05-07 46 views
1

我有一个包含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似乎可以很好地处理除空间以外的所有其他按钮。

我的键盘很好。

任何帮助将不胜感激。

回答

3

example所示,并在此tutorial中讨论,Boolean.class类型的表格列的默认呈现器和编辑器为JCheckBox。复选框的默认鼠标处理程序正常工作,并且默认Key Binding空间键。 UIManager属性Table.selectionBackground将以设计者偏好且用户期望的方式突出显示所选单元格。

我鼓励你放弃显示的方法并使用默认值。

+0

请原谅我的无能。你是否建议我使用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

+0

我使用这种方法的原因是因为JTable在一个选项卡中......记录的详细信息遍布所有选项卡。如果对记录的任何选项卡进行了更改,我希望更改所有选项卡的背景以便通知用户记录处于编辑状态。另外,我必须通知我的stateMachine(这是一个正确的方法)并启用/禁用CRUD按钮。 – greatkalu

+0

对不起,如果我暗示无能;我的意思是解决纯粹的无知,我自己包括在内。我无法解释你的'TableModelListener'问题;有一个例子[这里](http://stackoverflow.com/a/7137801/230513)。相关的标签应该观察表格的模型,而不是'JTable'视图本身。 CellEditor的生命周期在[here](http://stackoverflow.com/a/10067560/230513)中有说明。 – trashgod

1

问题的答案很简单。新手错误。这是我如何更新数据检索表(我的控制器在MVC模式; gui是视图实例)的一个片段。

// update tableUserSearchResult 
gui.setUserSearchTableData(tempList); 
gui.setUserSearchResultTableModel(new DefaultTableModel(
    gui.getUserSearchTableData(), gui.getUserSearchTableHeader())); 
gui.getTableUserSearchResult().setModel(gui.getUserSearchResultTableModel()); 

我真的不知道为什么创建一个新的DefaultTableModel实例造成这个错误,因为我定义和表的模型设定为新的实例。我假设......

然而,通过使用DefaultTableModelsetDataVector方法,我能够正确地更新DefaultTableModel(不创建)一个新的实例,以及它工作得很好:

gui.setUserRolePermissionsData(userRolePermissionList); 
gui.getUserRolePermissionsTableModel().setDataVector(
    gui.getUserRolePermissionsData(), gui.getUserRolePermissionsHeader()); 
gui.getTableUserRolePermissions().setModel(gui.getUserRolePermissionsTableModel()); 

这是我如何在我的视图中声明对象:

public class UserRoleInternalFrame extends JInternalFrame { 
DefaultTableModel userRoleDocumentsPermissionsTableModel; 
    Object [][] userRoleDocumentsPermissionsData; 
    String[] userRoleDocumentsPermissionsHeader = { 
     "Document", "Edit", "View", "Process", "Update" 
    }; 
    private JTable tableDocumentPermissions; 
    private JScrollPane scrollPaneDocumentPermissions; 

... 

this.userRolePermissionsTableModel = new DefaultTableModel(
    this.userRolePermissionsData, this.userRolePermissionsHeader); 
tableUserRolePermissions = new JTable(this.userRolePermissionsTableModel){ 
    @Override // in order to render JCheckBox 
    public Class getColumnClass(int c) { 
     if (c == 1 || c == 2 || c == 3 || c == 4){ 
      return Boolean.class; 
     } else { 
      return String.class; 
     } 
    } 
}; 

scrollPaneEntryTypePermissions.setColumnHeaderView(tableUserRolePermissions); 
    scrollPaneEntryTypePermissions.setViewportView(tableUserRolePermissions);