@Override
  protected ParametersListTable createParametersListTable() {
    return new ParametersListTable() {
      @Override
      protected JBTableRowRenderer getRowRenderer(int row) {
        return new EditorTextFieldJBTableRowRenderer(getProject(), PythonLanguage.getInstance(), getDisposable()) {
          @Override
          protected String getText(JTable table, int row) {
            final PyParameterTableModelItem pyItem = getRowItem(row);
            final StringBuilder text = new StringBuilder(pyItem.parameter.getName());
            final String defaultCallValue = pyItem.defaultValueCodeFragment.getText();
            final String defaultValue = pyItem.isDefaultInSignature() ? pyItem.defaultValueCodeFragment.getText() : "";

            if (StringUtil.isNotEmpty(defaultValue)) {
              text.append(" = ").append(defaultValue);
            }

            if (StringUtil.isNotEmpty(defaultCallValue)) {
              text.append(" // default value = ").append(defaultCallValue);
            }
            return text.toString();
          }
        };
      }

      @Override
      protected @NotNull JBTableRowEditor getRowEditor(ParameterTableModelItemBase<PyParameterInfo> item) {
        return new JBTableRowEditor() {
          private EditorTextField myNameEditor;
          private EditorTextField myDefaultValueEditor;
          private JCheckBox myDefaultInSignature;

          @Override
          public void prepareEditor(JTable table, int row) {
            setLayout(new GridLayout(1, 3));
            final JPanel parameterPanel = createParameterPanel();
            add(parameterPanel);
            final JPanel defaultValuePanel = createDefaultValuePanel();
            add(defaultValuePanel);
            final JPanel defaultValueCheckBox = createDefaultValueCheckBox();
            add(defaultValueCheckBox);

            final String nameText = myNameEditor.getText();
            final boolean couldHaveDefaultValue = ParamHelper.couldHaveDefaultValue(nameText) && !CANONICAL_SELF.equals(nameText);
            myDefaultValueEditor.setEnabled(couldHaveDefaultValue);
            myDefaultInSignature.setEnabled(couldHaveDefaultValue);
          }

          private JPanel createDefaultValueCheckBox() {
            final JPanel defaultValuePanel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP, 4, 2, true, false));

            final JBLabel inSignatureLabel = new JBLabel(PyBundle.message("refactoring.change.signature.dialog.default.value.checkbox"),
                                                         UIUtil.ComponentStyle.SMALL);
            defaultValuePanel.add(inSignatureLabel, BorderLayout.WEST);
            myDefaultInSignature = new JCheckBox();
            myDefaultInSignature.setSelected(((PyParameterTableModelItem)item).isDefaultInSignature());
            myDefaultInSignature.addItemListener(new ItemListener() {
              @Override
              public void itemStateChanged(ItemEvent event) {
                ((PyParameterTableModelItem)item).setDefaultInSignature(myDefaultInSignature.isSelected());
              }
            });
            myDefaultInSignature.addChangeListener(mySignatureUpdater);
            myDefaultInSignature.setEnabled(item.parameter.isNew());
            defaultValuePanel.add(myDefaultInSignature, BorderLayout.EAST);
            return defaultValuePanel;
          }

          private JPanel createDefaultValuePanel() {
            final JPanel defaultValuePanel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP, 4, 2, true, false));
            final Document doc = PsiDocumentManager.getInstance(getProject()).getDocument(item.defaultValueCodeFragment);
            myDefaultValueEditor = new EditorTextField(doc, getProject(), getFileType());
            final JBLabel defaultValueLabel =
              new JBLabel(RefactoringBundle.message("changeSignature.default.value.label"), UIUtil.ComponentStyle.SMALL);
            defaultValuePanel.add(defaultValueLabel);
            defaultValuePanel.add(myDefaultValueEditor);
            myDefaultValueEditor.setPreferredWidth(getTable().getWidth() / 2);
            myDefaultValueEditor.setFont(EditorUtil.getEditorFont());
            // The corresponding PyParameterInfo field can't be updated by just RowEditorChangeListener(1) 
            // because the corresponding column value is not String but Pair<PsiCodeFragment, Boolean>.
            myDefaultValueEditor.addDocumentListener(new DocumentListener() {
              @Override
              public void documentChanged(@NotNull DocumentEvent event) {
                item.parameter.setDefaultValue(myDefaultValueEditor.getText().trim());
              }
            });
            myDefaultValueEditor.addDocumentListener(mySignatureUpdater);
            return defaultValuePanel;
          }

          private JPanel createParameterPanel() {
            final JPanel namePanel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP, 4, 2, true, false));
            myNameEditor = new EditorTextField(item.parameter.getName(), getProject(), getFileType());
            final JBLabel nameLabel = new JBLabel(PyBundle.message("refactoring.change.signature.dialog.name.label"),
                                                  UIUtil.ComponentStyle.SMALL);
            namePanel.add(nameLabel);
            namePanel.add(myNameEditor);
            myNameEditor.setPreferredWidth(getTable().getWidth() / 2);
            myNameEditor.setFont(EditorUtil.getEditorFont());
            myNameEditor.addDocumentListener(new RowEditorChangeListener(0));
            myNameEditor.addDocumentListener(new DocumentListener() {
              @Override
              public void documentChanged(@NotNull DocumentEvent event) {
                final boolean couldHaveDefaultValue = ParamHelper.couldHaveDefaultValue(myNameEditor.getText());
                myDefaultValueEditor.setEnabled(couldHaveDefaultValue);
                myDefaultInSignature.setEnabled(couldHaveDefaultValue);
              }
            });

            myNameEditor.addDocumentListener(mySignatureUpdater);
            return namePanel;
          }

          @Override
          public JBTableRow getValue() {
            return new JBTableRow() {
              @Override
              public Object getValueAt(int column) {
                return switch (column) {
                  case 0 -> myNameEditor.getText().trim();
                  case 1 -> new Pair<>(item.defaultValueCodeFragment,
                                       ((PyParameterTableModelItem)item).isDefaultInSignature());
                  default -> null;
                };
              }
            };
          }

          @Override
          public JComponent getPreferredFocusedComponent() {
            return myNameEditor.getFocusTarget();
          }

          @Override
          public JComponent[] getFocusableComponents() {
            final List<JComponent> focusable = new ArrayList<>();
            focusable.add(myNameEditor.getFocusTarget());
            if (myDefaultValueEditor != null) {
              focusable.add(myDefaultValueEditor.getFocusTarget());
            }
            if (myDefaultInSignature != null) {
              focusable.add(myDefaultInSignature);
            }
            return focusable.toArray(new JComponent[0]);
          }
        };
      }

      @Override
      protected boolean isRowEmpty(int row) {
        return false;
      }
    };
  }
@Override
  protected ParametersListTable createParametersListTable()