Author: sletellier Date: 2012-06-25 13:31:31 +0200 (Mon, 25 Jun 2012) New Revision: 2339 Url: http://nuiton.org/repositories/revision/jaxx/2339 Log: fixes #2144 : Add method to select next editable cell on TAB key released Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/SwingUtil.java Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/SwingUtil.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/SwingUtil.java 2012-06-25 09:56:24 UTC (rev 2338) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/SwingUtil.java 2012-06-25 11:31:31 UTC (rev 2339) @@ -32,6 +32,8 @@ import java.awt.Font; import java.awt.FontMetrics; import java.awt.Rectangle; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; @@ -44,6 +46,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.Collection; +import java.util.EventObject; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; @@ -1178,4 +1181,89 @@ } return iconPath; } + + /** + * Add {@link java.awt.event.KeyListener} to focus next editable cell on TAB key + * + * @param table to add TAB {@link java.awt.event.KeyListener} + */ + public static void makeTableTabFocusable(final JTable table) { + table.setCellSelectionEnabled(true); + table.setSurrendersFocusOnKeystroke(true); + table.addKeyListener(new KeyAdapter() { + + @Override + public void keyReleased(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_TAB) { + + // get table informations + int selectedColumn = table.getSelectedColumn(); + int selectedRow = table.getSelectedRow(); + + if (log.isDebugEnabled()) { + log.debug("Selected was row[" + selectedRow + "] column[" + selectedColumn + "]"); + } + + int columnCount = table.getColumnCount(); + int rowCount = table.getRowCount(); + + // search on current line + for (int toSelectColumn = selectedColumn; toSelectColumn < columnCount; toSelectColumn++) { + + if (editCell(table, selectedRow, toSelectColumn)) { + return; + } + } + + // search on other lines + for (int toSelectRow = selectedRow; toSelectRow < rowCount; toSelectRow++) { + for (int toSelectColumn = 0; toSelectColumn < columnCount; toSelectColumn++) { + + if (editCell(table, toSelectRow, toSelectColumn)) { + return; + } + } + } + } + } + }); + } + + /** + * Used to edit cell + * + * @param table to edit + * @param row of cell to editing + * @param colummn of cell to editing + * @return false if for any reason the cell cannot be edited, + * or if the indices are invalid + */ + public static boolean editCell(JTable table, int row, int colummn) { + + if (table.isCellEditable(row, colummn)) { + + // get table informations + int selectedColumn = table.getSelectedColumn(); + int selectedRow = table.getSelectedRow(); + + // stop edition + TableCellEditor cellEditor = table.getCellEditor(selectedRow, selectedColumn); + cellEditor.stopCellEditing(); + + // select row + table.setColumnSelectionInterval(colummn, colummn); + table.setRowSelectionInterval(row, row); + + // edit cell + boolean result = table.editCellAt(row, colummn, new EventObject(table)); + Component component = table.getEditorComponent(); + component.requestFocus(); + + if (log.isDebugEnabled()) { + log.debug("Select row[" + row + "] column[" + colummn + "] return : " + result); + } + return result; + } + return false; + } }
participants (1)
-
sletellier@users.nuiton.org