2012-05-07 50 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);