JFace - Как я могу сделать редактируемым только один столбец в TreeViewer на основе значения флажка из другого столбца в той же строке?

У меня есть TreeViewer с двумя столбцами: ProximityClustersColumn: с именами в виде String, selectionColumn: с флажком, как показано на рисунке Дерево просмотра

У меня есть два вопроса:

  1. При установке флажка столбца выбора соответствующее имя ProximityClustersColumn должно стать редактируемым. Например: когда я нажимаю на флажок, соответствующий «Studium organisieren-Formelles», ячейка «Studium organisieren-Formelles» должна стать редактируемой.

  2. Кроме того, как видно из рисунка, необходимо сделать проверку так, чтобы только одно значение в группе, чей флажок установлен, стало редактируемым. Другими словами, для каждой группы можно проверить только одно имя категории, и это соответствующее имя должно быть редактируемым. Например: если вы посмотрите на вторую группу, там есть два имени кластера близости, то есть «Infos für Studis» и «Finanzielles im Studium», вместе с соответствующими флажками. Теперь я могу выбрать одно из двух имен, установив соответствующий флажок. Предположим, я нажимаю на флажок, соответствующий «Infos für Studis», только эта ячейка должна стать редактируемой.

Основная идея заключается в следующем: я должен иметь возможность выбирать только одно имя из каждой группы и редактировать его.

Я пробовал EditingSupport, предложенный @keyur, но метод «canEdit» вообще не вызывается.

Мой LabelProvider расширяет ColumnLabelProvider и реализует ITableLabelProvider. Мой ContentProvider реализует ITreeContentProvider.

Есть ли причина, по которой EditingSupport не работает?

public class ProximityClustersEditingSupport extends EditingSupport{
    private TreeViewer viewer;
    private CellEditor editor;

      public ProximityClustersEditingSupport(ColumnViewer columnViewer, TreeViewer treeViewer) {
        super(columnViewer);
        this.viewer = treeViewer;
        this.editor = new TextCellEditor(treeViewer.getTree());
      }

      @Override
      protected CellEditor getCellEditor(Object element) {
        return new TextCellEditor();
      }

      @Override
      protected boolean canEdit(Object element) {
        return true;
      }

      @Override
      protected Object getValue(Object element) {
          if(element instanceof ProbeSort)
                return ((ProximityClusters)element).proximityClusterNames;
                return element;
      }

      @Override
      protected void setValue(Object element, Object value) {
          if (element instanceof ProbeSort)
            {
                 ((ProximityClusters)element).setProximityClusterNames(String.valueOf(value));
            }
            viewer.update(element, null);
      }
}

person anjalli    schedule 20.04.2016    source источник


Ответы (3)


Я думаю, что мне нужно больше информации, чтобы ответить на него полностью. Прежде всего, это Treeviewer или Tableviewer. Для меня это похоже на TableViewer.

  1. Каково ожидаемое поведение ячейки, когда вы имеете в виду редактируемую. Те ячейки, которые не редактируются, должны иметь отключенный текст, окрашенный в цвет переднего плана, а тот, который доступен для редактирования, может иметь нормальный цвет переднего плана, например, черный. Только когда пользователь переходит в фокус (если вкладка поддерживается) или щелкает ячейку, лучше показать редактируемый текст, где пользователь может выбрать текст и изменить/отредактировать его. И нажав клавишу Enter или клавишу Tab, программа может принять изменение. Это то, что вы ищете?

  2. Кажется, я не понял вопроса. Можете ли вы привести пример из приведенного выше рисунка. Например, что такое группа?

person Dileep K V    schedule 20.04.2016
comment
Привет, я отредактировал свой вопрос и рисунок, чтобы сделать его более понятным. Это средство просмотра дерева, поставщик меток которого расширяет ITableLabelProvider. Под редактируемым я имею в виду, что я должен иметь возможность переименовывать имена. - person anjalli; 20.04.2016

Я думаю, что EditingSupport будет вам полезен.

Вы можете создать свой конкретный класс EditingSupport и назначить его своему столбцу. Он имеет метод «canEdit», с помощью которого вы можете динамически управлять редактированием.

Итак, что вам нужно сделать, это сохранить логический флаг в модели из статуса флажка или напрямую прочитать статус флажка и вернуть значение false/true, что включит/отключит редактирование.

person Keyur Mahajan    schedule 25.04.2016
comment
Я попробовал поддержку редактирования и назначил ее моему столбцу, но это не работает. Кнопка canEdit вообще не вызывается. - person anjalli; 25.04.2016
comment
кнопка canEdit ?? Я думаю, вы опечатались. вы пробовали ставить точки останова?. придется увидеть код для дальнейшей помощи. - person Keyur Mahajan; 25.04.2016
comment
Извините за опечатку. Да, я разместил код выше. Я пробовал с точками останова, и просмотрщик дерева не кликабельный, он не выходит за пределы строки: super(columnViewer); в моем конструкторе ProximityClustersEditingSupport - person anjalli; 25.04.2016
comment
@анджалли. Я вижу, что вы создали новый TextCellEditor() в методе getCellEditor. Хотя вы уже создали редактор в самом конструкторе, используя дерево в качестве родителя. поэтому просто верните редактор тем же методом. Прямо сейчас нет родителя для текстового редактора, поскольку вы создаете простой новый экземпляр. - person Keyur Mahajan; 25.04.2016
comment
Я упустил это из виду. Я упомянул как редактор, но результата нет. Теперь отладка происходит до тех пор, пока this.editor = new TextCellEditor(treeViewer.getTree()) не завершится. Вот код, как я включил поддержку редактирования в столбце просмотра дерева: - person anjalli; 25.04.2016
comment
Надеюсь, вы знаете, что метод canEdit будет вызываться только при выборе конкретной ячейки столбца. Вы можете изменить значение в ячейке сейчас? - person Keyur Mahajan; 25.04.2016
comment
Да, я знаю, что означает canEdit. Проблема в том, что я использовал средство просмотра дерева с поставщиком меток, которое расширяет ColumnLabelProvider и реализует ITableLabelProvider. Я предполагаю, что это причина, по которой редактирование не поддерживается, и обходной путь имеет решающее значение. - person anjalli; 25.04.2016
comment
в порядке. Я реализовал почти аналогичную функцию в таблице год назад. У меня была таблица с labelprovider, которая расширяла LabelProvider и реализовывала ITableLabelProvider и использовала EditingSupport. Я не понимаю, что не так в вашем случае. - person Keyur Mahajan; 26.04.2016

Программа в ссылка показывает все возможные реализации, связанные со средством просмотра дерева. Скопируйте и вставьте программу в новый класс Java и запустите как приложение Java. Этот пример решил все проблемы, связанные с деревом, которые у меня были в моей реализации.

person LathaPatil    schedule 20.12.2019