我有一個包含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