JTable with a complex editor

前端 未结 4 1912
花落未央
花落未央 2021-02-02 03:33

I have many custom editors for a JTable and it\'s an understatement to say that the usability, particularly in regard to editing with the keyboard, is lacking.

The main

4条回答
  •  醉话见心
    2021-02-02 03:57

    I fixed something similar in 2 steps

    First override the editCellAt from your JTable and call requestFocus after preparing the editor:

    public boolean editCellAt( int row, int column, EventObject e )
    {
      if ( cellEditor != null && !cellEditor.stopCellEditing() )
        {
        return false;
        }
    
      if ( row < 0 || row >= getRowCount() ||
          column < 0 || column >= getColumnCount() )
        {
        return false;
        }
    
      if ( !isCellEditable(row, column) )
        return false;
    
      TableCellEditor editor=getCellEditor(row, column);
      if ( editor != null && editor.isCellEditable(e) )
        {
        editorComp=prepareEditor(editor, row, column);
        if ( editorComp == null )
          {
          removeEditor();
          return false;
          }
        //aangepast
        Rectangle rect=getCellRect(row, column, false);
        if ( datamodel_.useAdaptedEditorRect() )
          rect=datamodel_.changeRectangle(rect, editorComp);
        editorComp.setBounds(rect);
        add(editorComp);
        editorComp.validate();
    
        setCellEditor(editor);
        setEditingRow(row);
        setEditingColumn(column);
        editor.addCellEditorListener(this);
        //NEXT LINE ADDED 
        editorComp.requestFocus();
        return true;
        }
      return false;
    }
    

    Then overload the requestFocus from your JPanel and make sure your textfield is put as editorComponent:

    public class EditorPanel extends JPanel {
       JComponent editorComponent;
    
       public boolean isRequestFocusEnabled()
       {
         return true;
       }
    
       public void requestFocus()
       {
       editorComponent.requestFocus();
       }
    }
    

    You can always grab the keyEvent and set it yourself:

    AWTEvent event = EventQueue.getCurrentEvent();
    if ( event instanceof KeyEvent )
      {
      char newSelection = ( (KeyEvent) event).getKeyChar();
      int keyCode = ( (KeyEvent) event ).getKeyCode();
      editorComponent.requestFocus();
      if ( editorComponent instanceof JTextField )
        {
        if ( ( newSelection >= (char) FIRST_ALLOWED_CHAR ) && ( newSelection != (char) LAST_ALLOWED_CHAR ) ) //comes from DefaultKeyTypedAction
           ( (JTextField) editorComponent ).setText(Character.toString(newSelection));
        if ( keyCode == KeyEvent.VK_BACK_SPACE || keyCode == KeyEvent.VK_DELETE )
          ( (JTextField) editorComponent ).setText("");          
        }
      }
    else
      editorComponent.requestFocus();
    

提交回复
热议问题