diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/gui/util/ParameterTable.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/gui/util/ParameterTable.java | 461 |
1 files changed, 275 insertions, 186 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/gui/util/ParameterTable.java b/src/de/lmu/ifi/dbs/elki/gui/util/ParameterTable.java index 105242c0..aa94f3ef 100644 --- a/src/de/lmu/ifi/dbs/elki/gui/util/ParameterTable.java +++ b/src/de/lmu/ifi/dbs/elki/gui/util/ParameterTable.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.gui.util; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -29,18 +29,19 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.FileDialog; import java.awt.Frame; -import java.awt.Insets; -import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; import java.io.File; import java.util.BitSet; import javax.swing.AbstractCellEditor; import javax.swing.Action; import javax.swing.ActionMap; +import javax.swing.BorderFactory; import javax.swing.DefaultCellEditor; +import javax.swing.Icon; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComboBox; @@ -50,11 +51,17 @@ import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; -import javax.swing.plaf.basic.BasicComboPopup; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellEditor; import javax.swing.table.TableColumn; - +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeModel; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; + +import de.lmu.ifi.dbs.elki.gui.icons.StockIcon; +import de.lmu.ifi.dbs.elki.gui.util.ClassTree.ClassNode; import de.lmu.ifi.dbs.elki.logging.LoggingUtil; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ClassListParameter; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ClassParameter; @@ -134,6 +141,54 @@ public class ParameterTable extends JTable { col1.setPreferredWidth(150); TableColumn col2 = this.getColumnModel().getColumn(1); col2.setPreferredWidth(650); + this.addKeyListener(new Handler()); + + // Increase row height, to make editors usable. + setRowHeight(getRowHeight() + 4); + } + + /** + * Internal key listener. + * + * @author Erich Schubert + * + * @apiviz.exclude + */ + protected class Handler implements KeyListener { + @Override + public void keyTyped(KeyEvent e) { + // ignore + } + + @Override + public void keyPressed(KeyEvent e) { + if((e.getModifiersEx() & KeyEvent.CTRL_DOWN_MASK) != 0) { + if(e.getKeyCode() == KeyEvent.VK_SPACE // + || e.getKeyCode() == KeyEvent.VK_ENTER // + || e.getKeyCode() == KeyEvent.VK_DOWN // + || e.getKeyCode() == KeyEvent.VK_KP_DOWN) { + final ParameterTable parent = ParameterTable.this; + if(!parent.isEditing()) { + int leadRow = parent.getSelectionModel().getLeadSelectionIndex(); + int leadColumn = parent.getColumnModel().getSelectionModel().getLeadSelectionIndex(); + parent.editCellAt(leadRow, leadColumn); + Component editorComponent = getEditorComponent(); + // This is a hack, to make the content assist open immediately. + if(editorComponent instanceof DispatchingPanel) { + KeyListener[] l = ((DispatchingPanel) editorComponent).component.getKeyListeners(); + for(KeyListener li : l) { + li.keyPressed(e); + } + } + } + } + } + } + + @Override + public void keyReleased(KeyEvent e) { + // ignore + } } /** @@ -156,16 +211,16 @@ public class ParameterTable extends JTable { @Override public void setValue(Object value) { - if (value instanceof String) { + if(value instanceof String) { setText((String) value); setToolTipText(null); return; } - if (value instanceof DynamicParameters.Node) { + if(value instanceof DynamicParameters.Node) { Parameter<?> o = ((DynamicParameters.Node) value).param; // Simulate a tree using indentation - there is no JTreeTable AFAICT StringBuilder buf = new StringBuilder(); - for (int i = 1; i < ((DynamicParameters.Node) value).depth; i++) { + for(int i = 1; i < ((DynamicParameters.Node) value).depth; i++) { buf.append(' '); } buf.append(o.getOptionID().getName()); @@ -180,22 +235,27 @@ public class ParameterTable extends JTable { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); - if (!hasFocus) { - if (row < parameters.size()) { + if(!hasFocus) { + if(row < parameters.size()) { BitSet flags = parameters.getNode(row).flags; // TODO: don't hardcode black - maybe mix the other colors, too? c.setForeground(Color.BLACK); - if ((flags.get(DynamicParameters.BIT_INVALID))) { + if((flags.get(DynamicParameters.BIT_INVALID))) { c.setBackground(COLOR_SYNTAX_ERROR); - } else if ((flags.get(DynamicParameters.BIT_SYNTAX_ERROR))) { + } + else if((flags.get(DynamicParameters.BIT_SYNTAX_ERROR))) { c.setBackground(COLOR_SYNTAX_ERROR); - } else if ((flags.get(DynamicParameters.BIT_INCOMPLETE))) { + } + else if((flags.get(DynamicParameters.BIT_INCOMPLETE))) { c.setBackground(COLOR_INCOMPLETE); - } else if ((flags.get(DynamicParameters.BIT_DEFAULT_VALUE))) { + } + else if((flags.get(DynamicParameters.BIT_DEFAULT_VALUE))) { c.setBackground(COLOR_DEFAULT_VALUE); - } else if ((flags.get(DynamicParameters.BIT_OPTIONAL))) { + } + else if((flags.get(DynamicParameters.BIT_OPTIONAL))) { c.setBackground(COLOR_OPTIONAL); - } else { + } + else { c.setBackground(null); } } @@ -209,7 +269,7 @@ public class ParameterTable extends JTable { * * @author Erich Schubert */ - private class DropdownEditor extends DefaultCellEditor { + private class DropdownEditor extends DefaultCellEditor implements KeyListener { /** * Serial Version */ @@ -236,6 +296,32 @@ public class ParameterTable extends JTable { panel = new DispatchingPanel((JComponent) comboBox.getEditor().getEditorComponent()); panel.setLayout(new BorderLayout()); panel.add(comboBox, BorderLayout.CENTER); + comboBox.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 3)); + } + + @Override + public void keyTyped(KeyEvent e) { + // Ignore + } + + @Override + public void keyPressed(KeyEvent e) { + if((e.getModifiersEx() & KeyEvent.CTRL_DOWN_MASK) != 0) { + if(e.getKeyCode() == KeyEvent.VK_SPACE // + || e.getKeyCode() == KeyEvent.VK_ENTER // + || e.getKeyCode() == KeyEvent.VK_DOWN // + || e.getKeyCode() == KeyEvent.VK_KP_DOWN) { + if(!comboBox.isPopupVisible()) { + comboBox.showPopup(); + e.consume(); + } + } + } + } + + @Override + public void keyReleased(KeyEvent e) { + // Ignore } @Override @@ -244,54 +330,40 @@ public class ParameterTable extends JTable { comboBox.removeAllItems(); // Put the current value in first. Object val = table.getValueAt(row, column); - if (val != null && val instanceof String) { + if(val != null && val instanceof String) { String sval = (String) val; - if (sval.equals(DynamicParameters.STRING_OPTIONAL)) { + if(sval.equals(DynamicParameters.STRING_OPTIONAL)) { sval = ""; } - if (sval.startsWith(DynamicParameters.STRING_USE_DEFAULT)) { + if(sval.startsWith(DynamicParameters.STRING_USE_DEFAULT)) { sval = ""; } - if (sval != "") { + if(sval != "") { comboBox.addItem(sval); comboBox.setSelectedIndex(0); } } - if (row < parameters.size()) { + if(row < parameters.size()) { Parameter<?> option = parameters.getNode(row).param; - // We can do dropdown choices for class parameters - if (option instanceof ClassParameter<?>) { - ClassParameter<?> cp = (ClassParameter<?>) option; - // For parameters with a default value, offer using the default - // For optional parameters, offer not specifying them. - if (cp.hasDefaultValue()) { - comboBox.addItem(DynamicParameters.STRING_USE_DEFAULT + cp.getDefaultValueAsString()); - } else if (cp.isOptional()) { - comboBox.addItem(DynamicParameters.STRING_OPTIONAL); - } - // Offer the shorthand version of class names. - for (Class<?> impl : cp.getKnownImplementations()) { - comboBox.addItem(ClassParameter.canonicalClassName(impl, cp.getRestrictionClass())); - } - } - // and for Flag parameters. - else if (option instanceof Flag) { - if (!Flag.SET.equals(val)) { + // for Flag parameters. + if(option instanceof Flag) { + if(!Flag.SET.equals(val)) { comboBox.addItem(Flag.SET); } - if (!Flag.NOT_SET.equals(val)) { + if(!Flag.NOT_SET.equals(val)) { comboBox.addItem(Flag.NOT_SET); } } // and for Enum parameters. - else if (option instanceof EnumParameter<?>) { + else if(option instanceof EnumParameter<?>) { EnumParameter<?> ep = (EnumParameter<?>) option; - for (String s : ep.getPossibleValues()) { - if (ep.hasDefaultValue() && ep.getDefaultValueAsString().equals(s)) { - if (!(DynamicParameters.STRING_USE_DEFAULT + ep.getDefaultValueAsString()).equals(val)) { + for(String s : ep.getPossibleValues()) { + if(ep.hasDefaultValue() && ep.getDefaultValueAsString().equals(s)) { + if(!(DynamicParameters.STRING_USE_DEFAULT + ep.getDefaultValueAsString()).equals(val)) { comboBox.addItem(DynamicParameters.STRING_USE_DEFAULT + s); } - } else if (!s.equals(val)) { + } + else if(!s.equals(val)) { comboBox.addItem(s); } } @@ -307,7 +379,7 @@ public class ParameterTable extends JTable { * * @author Erich Schubert */ - private class FileNameEditor extends AbstractCellEditor implements TableCellEditor, ActionListener { + private class FileNameEditor extends AbstractCellEditor implements TableCellEditor, ActionListener, KeyListener { /** * Serial version number */ @@ -334,6 +406,11 @@ public class ParameterTable extends JTable { int mode = FileDialog.LOAD; /** + * Default path. + */ + String defaultpath = (new File(".")).getAbsolutePath(); + + /** * Constructor. */ public FileNameEditor() { @@ -342,6 +419,8 @@ public class ParameterTable extends JTable { panel.setLayout(new BorderLayout()); panel.add(textfield, BorderLayout.CENTER); panel.add(button, BorderLayout.EAST); + textfield.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 3)); + textfield.addKeyListener(this); } /** @@ -349,38 +428,47 @@ public class ParameterTable extends JTable { */ @Override public void actionPerformed(ActionEvent e) { - final FileDialog fc = new FileDialog(frame); - fc.setDirectory((new File(".")).getAbsolutePath()); + FileDialog fc = new FileDialog(frame); + fc.setDirectory(defaultpath); fc.setMode(mode); final String curr = textfield.getText(); - if (curr != null && curr.length() > 0) { + if(curr != null && curr.length() > 0) { fc.setFile(curr); } fc.setVisible(true); String filename = fc.getFile(); - if (filename != null) { + if(filename != null) { textfield.setText(new File(fc.getDirectory(), filename).getPath()); } + fc.setVisible(false); fc.dispose(); textfield.requestFocus(); - - // Swing file chooser. Currently much worse on Linux/GTK. - // final JFileChooser fc = new JFileChooser(new File(".")); - // final String curr = textfield.getText(); - // if (curr != null && curr.length() > 0) { - // fc.setSelectedFile(new File(curr)); - // } - // int returnVal = fc.showOpenDialog(button); - // - // if(returnVal == JFileChooser.APPROVE_OPTION) { - // textfield.setText(fc.getSelectedFile().getPath()); - // } - // else { - // // Do nothing on cancel. - // } fireEditingStopped(); } + @Override + public void keyTyped(KeyEvent e) { + // Ignore + } + + @Override + public void keyPressed(KeyEvent e) { + if((e.getModifiersEx() & KeyEvent.CTRL_DOWN_MASK) != 0) { + if(e.getKeyCode() == KeyEvent.VK_SPACE // + || e.getKeyCode() == KeyEvent.VK_ENTER // + || e.getKeyCode() == KeyEvent.VK_DOWN // + || e.getKeyCode() == KeyEvent.VK_KP_DOWN) { + e.consume(); + actionPerformed(new ActionEvent(e.getSource(), ActionEvent.ACTION_PERFORMED, "assist")); + } + } + } + + @Override + public void keyReleased(KeyEvent e) { + // Ignore + } + /** * Delegate getCellEditorValue to the text field. */ @@ -394,21 +482,16 @@ public class ParameterTable extends JTable { */ @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { - if (row < parameters.size()) { + if(row < parameters.size()) { Parameter<?> option = parameters.getNode(row).param; - if (option instanceof FileParameter) { + if(option instanceof FileParameter) { FileParameter fp = (FileParameter) option; File f = null; mode = FileParameter.FileType.INPUT_FILE.equals(fp.getFileType()) ? FileDialog.LOAD : FileDialog.SAVE; - if (fp.isDefined()) { + if(fp.isDefined()) { f = fp.getValue(); } - if (f != null) { - String fn = f.getPath(); - textfield.setText(fn); - } else { - textfield.setText(""); - } + textfield.setText(f != null ? f.getPath() : ""); } } textfield.requestFocus(); @@ -417,11 +500,11 @@ public class ParameterTable extends JTable { } /** - * Editor for selecting input and output file and folders names + * Editor for choosing classes. * * @author Erich Schubert */ - private class ClassListEditor extends AbstractCellEditor implements TableCellEditor, ActionListener { + private class ClassListEditor extends AbstractCellEditor implements TableCellEditor, ActionListener, KeyListener { /** * Serial version number */ @@ -443,30 +526,43 @@ public class ParameterTable extends JTable { final JButton button = new JButton("+"); /** - * The combobox we are abusing to produce the popup + * The popup menu. */ - final JComboBox<String> combo = new JComboBox<>(); + final TreePopup popup; /** - * The popup menu. + * Tree model */ - final SuperPopup popup; + private TreeModel model; + + /** + * Parameter we are currently editing. + */ + private Parameter<?> option; /** * Constructor. */ public ClassListEditor() { + textfield.addKeyListener(this); button.addActionListener(this); - // So the first item doesn't get automatically selected - combo.setEditable(true); - combo.addActionListener(this); - popup = new SuperPopup(combo); + model = new DefaultTreeModel(new DefaultMutableTreeNode()); + popup = new TreePopup(model); + popup.getTree().setRootVisible(false); + popup.addActionListener(this); + + Icon classIcon = StockIcon.getStockIcon(StockIcon.GO_NEXT); + Icon packageIcon = StockIcon.getStockIcon(StockIcon.PACKAGE); + TreePopup.Renderer renderer = (TreePopup.Renderer) popup.getTree().getCellRenderer(); + renderer.setLeafIcon(classIcon); + renderer.setFolderIcon(packageIcon); panel = new DispatchingPanel(textfield); panel.setLayout(new BorderLayout()); panel.add(textfield, BorderLayout.CENTER); panel.add(button, BorderLayout.EAST); + textfield.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 3)); } /** @@ -474,80 +570,42 @@ public class ParameterTable extends JTable { */ @Override public void actionPerformed(ActionEvent e) { - if (e.getSource() == button) { + if(e.getSource() == button) { popup.show(panel); - } else if (e.getSource() == combo) { - String newClass = (String) combo.getSelectedItem(); - if (newClass != null && newClass.length() > 0) { - String val = textfield.getText(); - if (val.equals(DynamicParameters.STRING_OPTIONAL)) { - val = ""; - } - if (val.startsWith(DynamicParameters.STRING_USE_DEFAULT)) { - val = ""; - } - if (val.length() > 0) { - val = val + ClassListParameter.LIST_SEP + newClass; - } else { - val = newClass; + return; + } + if(e.getSource() == popup) { + if(e.getActionCommand() == TreePopup.ACTION_CANCELED) { + popup.setVisible(false); + textfield.requestFocus(); + return; + } + TreePath path = popup.getTree().getSelectionPath(); + final Object comp = (path != null) ? path.getLastPathComponent() : null; + if(comp instanceof ClassNode) { + ClassNode sel = (path != null) ? (ClassNode) comp : null; + String newClass = (sel != null) ? sel.getClassName() : null; + if(newClass != null && newClass.length() > 0) { + if(option instanceof ClassListParameter) { + String val = textfield.getText(); + if(val.equals(DynamicParameters.STRING_OPTIONAL) // + || val.startsWith(DynamicParameters.STRING_USE_DEFAULT)) { + val = ""; + } + val = (val.length() > 0) ? val + ClassListParameter.LIST_SEP + newClass : newClass; + textfield.setText(val); + } + else { + textfield.setText(newClass); + } + popup.setVisible(false); + fireEditingStopped(); + textfield.requestFocus(); } - textfield.setText(val); - popup.hide(); } - fireEditingStopped(); - } else { - LoggingUtil.warning("Unrecognized action event in ClassListEditor: " + e); - } - } - - /** - * Modified popup - * - * @author Erich Schubert - * - * @apiviz.exclude - */ - class SuperPopup extends BasicComboPopup { - /** - * Serial version - */ - private static final long serialVersionUID = 1L; - - /** - * Constructor. - * - * @param combo Combo box used for data storage. - */ - public SuperPopup(JComboBox<String> combo) { - super(combo); - } - - /** - * Show the menu on a particular panel. - * - * This code is mostly copied from - * {@link BasicComboPopup#getPopupLocation} - * - * @param parent Parent element to show at. - */ - public void show(JPanel parent) { - Dimension popupSize = parent.getSize(); - Insets insets = getInsets(); - - // reduce the width of the scrollpane by the insets so that the popup - // is the same width as the combo box. - popupSize.setSize(popupSize.width - (insets.right + insets.left), getPopupHeightForRowCount(comboBox.getMaximumRowCount())); - Rectangle popupBounds = computePopupBounds(0, comboBox.getBounds().height, popupSize.width, popupSize.height); - Dimension scrollSize = popupBounds.getSize(); - - scroller.setMaximumSize(scrollSize); - scroller.setPreferredSize(scrollSize); - scroller.setMinimumSize(scrollSize); - - list.revalidate(); - - super.show(parent, 0, parent.getBounds().height); + return; } + LoggingUtil.warning("Unrecognized action event in ClassListEditor: " + e); } /** @@ -558,36 +616,65 @@ public class ParameterTable extends JTable { return textfield.getText(); } + @Override + public void keyTyped(KeyEvent e) { + // Ignore + } + + @Override + public void keyPressed(KeyEvent e) { + if((e.getModifiersEx() & KeyEvent.CTRL_DOWN_MASK) != 0) { + if(e.getKeyCode() == KeyEvent.VK_SPACE // + || e.getKeyCode() == KeyEvent.VK_ENTER // + || e.getKeyCode() == KeyEvent.VK_DOWN // + || e.getKeyCode() == KeyEvent.VK_KP_DOWN) { + if(!popup.isVisible()) { + popup.show(ClassListEditor.this.panel); + e.consume(); + } + } + } + } + + @Override + public void keyReleased(KeyEvent e) { + // Ignore + } + /** * Apply the Editor for a selected option. */ @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { - combo.removeAllItems(); - if (row < parameters.size()) { - Parameter<?> option = parameters.getNode(row).param; + if(row < parameters.size()) { + this.option = parameters.getNode(row).param; + TreeNode root; // We can do dropdown choices for class parameters - if (option instanceof ClassListParameter<?>) { + if(option instanceof ClassListParameter<?>) { ClassListParameter<?> cp = (ClassListParameter<?>) option; - // Offer the shorthand version of class names. - String prefix = cp.getRestrictionClass().getPackage().getName() + "."; - for (Class<?> impl : cp.getKnownImplementations()) { - String name = impl.getName(); - if (name.startsWith(prefix)) { - name = name.substring(prefix.length()); - } - combo.addItem(name); - } + root = ClassTree.build(cp.getKnownImplementations(), cp.getRestrictionClass().getPackage().getName()); + button.setText("+"); + } + else if(option instanceof ClassParameter<?>) { + ClassParameter<?> cp = (ClassParameter<?>) option; + root = ClassTree.build(cp.getKnownImplementations(), cp.getRestrictionClass().getPackage().getName()); + button.setText("v"); + } + else { + root = new DefaultMutableTreeNode(); } - if (option.isDefined()) { - if (option.tookDefaultValue()) { + if(option.isDefined()) { + if(option.tookDefaultValue()) { textfield.setText(DynamicParameters.STRING_USE_DEFAULT + option.getDefaultValueAsString()); - } else { + } + else { textfield.setText(option.getValueAsString()); } - } else { + } + else { textfield.setText(""); } + popup.getTree().setModel(new DefaultTreeModel(root)); } return panel; } @@ -642,14 +729,16 @@ public class ParameterTable extends JTable { final JComboBox<String> combobox = new JComboBox<>(); combobox.setEditable(true); this.dropdownEditor = new DropdownEditor(combobox); - this.plaintextEditor = new DefaultCellEditor(new JTextField()); + JTextField tf = new JTextField(); + tf.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 3)); + this.plaintextEditor = new DefaultCellEditor(tf); this.classListEditor = new ClassListEditor(); this.fileNameEditor = new FileNameEditor(); } @Override public Object getCellEditorValue() { - if (activeEditor == null) { + if(activeEditor == null) { return null; } return activeEditor.getCellEditorValue(); @@ -657,31 +746,31 @@ public class ParameterTable extends JTable { @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { - if (value instanceof String) { + if(value instanceof String) { String s = (String) value; - if (s.startsWith(DynamicParameters.STRING_USE_DEFAULT)) { + if(s.startsWith(DynamicParameters.STRING_USE_DEFAULT)) { value = s.substring(DynamicParameters.STRING_USE_DEFAULT.length()); } } - if (row < parameters.size()) { + if(row < parameters.size()) { Parameter<?> option = parameters.getNode(row).param; - if (option instanceof Flag) { + if(option instanceof Flag) { activeEditor = dropdownEditor; return dropdownEditor.getTableCellEditorComponent(table, value, isSelected, row, column); } - if (option instanceof ClassListParameter<?>) { + if(option instanceof ClassListParameter<?>) { activeEditor = classListEditor; return classListEditor.getTableCellEditorComponent(table, value, isSelected, row, column); } - if (option instanceof ClassParameter<?>) { - activeEditor = dropdownEditor; - return dropdownEditor.getTableCellEditorComponent(table, value, isSelected, row, column); + if(option instanceof ClassParameter<?>) { + activeEditor = classListEditor; + return classListEditor.getTableCellEditorComponent(table, value, isSelected, row, column); } - if (option instanceof FileParameter) { + if(option instanceof FileParameter) { activeEditor = fileNameEditor; return fileNameEditor.getTableCellEditorComponent(table, value, isSelected, row, column); } - if (option instanceof EnumParameter<?>) { + if(option instanceof EnumParameter<?>) { activeEditor = dropdownEditor; return dropdownEditor.getTableCellEditorComponent(table, value, isSelected, row, column); } @@ -733,10 +822,10 @@ public class ParameterTable extends JTable { InputMap map = component.getInputMap(condition); ActionMap am = component.getActionMap(); - if (map != null && am != null && isEnabled()) { + if(map != null && am != null && isEnabled()) { Object binding = map.get(ks); Action action = (binding == null) ? null : am.get(binding); - if (action != null) { + if(action != null) { return SwingUtilities.notifyAction(action, ks, e, component, e.getModifiers()); } } |