Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4684090

Tab on editable JComboBox inside JTable transfers focus outside JTable

    XMLWordPrintable

Details

    • generic, x86
    • generic, windows_xp

    Description

      This bug was originally submitted as the first part of 4528436 and was closed as a duplicate of RFE 4307147. The submitter and I both believe that this issue is unrelated to that RFE. I am therefore opening this new bug. The original description for that issue is:

      A: regarding termination of edit

      1. when tabbing out of an editing combo (caret blinking in
      its JTextField, does accept key input) focus is transferred to
      the next component _outside_ the table. In the example that's the
      button if the scrollbar is not visible, it's the ScrollBar if visible
      (IMO that's another bug: scrollbars should _never_ be focusOwners).

      2. same happens when hitting enter

      Code:

      import javax.swing.*;
      import javax.swing.event.*;
      import javax.swing.table.*;

      import java.awt.event.*;
      import java.awt.*;
      import java.beans.*;
      //import de.kleopatra.support.debugon.*;

      /**
       * Trace focus with editable combo as editor
       */
      public class ClickCombo {

      protected JFrame frame ;
      // table vars
      protected final int ROWS = 15;
      protected final int COLUMNS = 3;
      protected DefaultTableModel model;
      protected JTable table;


      public ClickCombo() {
      frame = new JFrame("ClickCombo");
      frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
      frame.getContentPane().add(buildMainPanel());
      frame.getContentPane().add(buildButtonPanel(),
      BorderLayout.SOUTH);
      frame.pack();
      // frame.setSize(300, 200);
      frame.show();
      installFocusTracer();
      }

      //---------------------------tracing focus

        protected void installFocusTracer() {
         KeyboardFocusManager focusManager = KeyboardFocusManager.
         getCurrentKeyboardFocusManager();
         new FocusOwnerTracer(focusManager);
        }
        
        public class FocusOwnerTracer implements PropertyChangeListener {
      public static final String FOCUS_OWNER_PROPERTY = "focusOwner";
      protected KeyboardFocusManager focusManager;

      public FocusOwnerTracer(KeyboardFocusManager focusManager) {
      this.focusManager = focusManager;
      startListening();
      }

      public void startListening() {
      if (focusManager != null) {

      focusManager.addPropertyChangeListener(FOCUS_OWNER_PROPERTY, this);
      }
      }

      public void stopListening() {
      if (focusManager != null) {

      focusManager.removePropertyChangeListener(FOCUS_OWNER_PROPERTY, this);
      }
      }

      public void propertyChange(PropertyChangeEvent e) {
      Component oldOwner = (Component) e.getOldValue();
      Component newOwner = (Component) e.getNewValue();
      ebug("focusOwner changed: ", "");
      debugClass(" old: ", oldOwner);
      debugClass(" new: ", newOwner);
      }

      protected void debugClass(String msg, Object o) {
      ebug(msg, o != null ? o.getClass() : null);
      }
      }

      //---------------------------helper

      protected void ebug(String text, Object o) {
      System.out.println(text + o);
      }

      //---------------------------init ui

      protected JComponent buildMainPanel() {
      JPanel panel = new JPanel();
      panel.setLayout(new BorderLayout());
      initTable();
      JScrollPane scroll = new JScrollPane(table);
      panel.add(scroll);
      return panel;
      }

      protected void initTable() {
      table = createTable(ROWS, COLUMNS);
      model = (DefaultTableModel) table.getModel();
      table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
      initComboEditor(0, true);
      }

      protected void initComboEditor(int col, boolean editable) {
      String[] list = { "one", "two", "three", "four", "five", "six"
      };
      JComboBox box = new JComboBox(list);
      // trying to properly get key input if table surrenders focus
      /* {
      public void requestFocus() {
      ebug("Combo: request focus ","");
      if (isEditable()) {

      getEditor().getEditorComponent().requestFocus();
      } else {
      super.requestFocus();
      }
      }
      };
      */
      box.setEditable(editable);
      // setBoxVerifier((box));
      TableCellEditor editor = new DefaultCellEditor(box);
      setColumnEditorAt(editor, col);
      }

      protected void setColumnEditorAt(TableCellEditor editor, int col) {
      table.getColumnModel().getColumn(col).setCellEditor(editor);
      }

      protected JComponent buildButtonPanel() {
      JPanel panel = new JPanel();
      final JButton button = new JButton("surrender off");
      button.setMnemonic('s');
      frame.getRootPane().setDefaultButton(button);
      ActionListener action = new ActionListener() {
      public void actionPerformed(ActionEvent event) {
      boolean surrender =
      !table.getSurrendersFocusOnKeystroke();
      table.setSurrendersFocusOnKeystroke(surrender);
      if (surrender) {
      button.setText("surrender on");
      } else {
      button.setText("surrender off");
      }
      }
      };
      button.addActionListener(action);
      panel.add(button);
      return panel;
      }

      //---------------------------factory methods

      protected JTable createTable(int r, int c) {
      JTable table= new JTable(r, c);
      return table;
      }

      //---------------------------Main

      public static void main(String[] args) {
      // LFSwitcher.windowsLF();
      new ClickCombo();
      }
      }

      Attachments

        Issue Links

          Activity

            People

              shickeysunw Shannon Hickey (Inactive)
              shickeysunw Shannon Hickey (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:
                Imported:
                Indexed: