【问题标题】:JFace - How can I make only one column editable in TreeViewer based on checkbox value from another column in the same row?JFace - 如何根据同一行中另一列的复选框值在 TreeViewer 中仅编辑一列?
【发布时间】:2016-08-13 05:24:47
【问题描述】:

我有一个TreeViewer,它有两列:ProximityClustersColumn: 名称为 String,selectionColumn: 有复选框,如图 TreeViewer

我有两个问题:

  1. 单击选择列的复选框后,ProximityClustersColumn 的相应名称应变为可编辑。 例如:当我点击“Studiumorganisieren-Formelles”对应的复选框时,单元格“Studiumorganisieren-Formelles”应该变成可编辑的。

  2. 此外,如图所示,必须进行检查,以使组中只有一个复选框被选中的值变为可编辑。 换句话说,对于每个组,只能检查一个类别名称,并且对应的名称应该是可编辑的。 例如: 如果您查看第二组,则有两个邻近集群名称,即“Infos für Studis”和“Finanzielles im Studium”,以及它们各自的复选框。现在,我可以通过选中相应的复选框在两个名称中选择一个。假设,我点击“Infos für Studis”对应的复选框,只有那个单元格应该变成可编辑的。

主要思想是:我应该只能从每个组中选择一个名称并对其进行编辑。

我按照@keyur 的建议尝试了EditingSupport,但根本没有调用“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);
      }
}

【问题讨论】:

    标签: java checkbox swt treeviewer


    【解决方案1】:

    我想我需要更多信息才能完全回答。首先就是那个Treeviewer或者Tableviewer。对我来说,它看起来像 TableViewer。

    1. 当您的意思是可编辑时,单元格的预期行为是什么。那些不可编辑的单元格应具有禁用类型的前景色文本,而可编辑的单元格可以具有正常的前景色,例如黑色。仅当用户更改焦点(如果支持选项卡)或单击单元格时,最好显示可编辑文本,用户可以在其中选择文本并更改/编辑它。并且按 Enter 键或 Tab Key 程序可以接受更改。这就是你要找的东西吗?

    2. 我想我没有得到这个问题。你能从上图中举个例子吗?比如什么是组?

    【讨论】:

    • 您好,我已经编辑了我的问题和图表,使其更加清晰。它是一个树形查看器,其标签提供程序扩展了 ITableLabelProvider。通过可编辑,我的意思是我应该能够重命名这些名称。
    【解决方案2】:

    我认为EditingSupport 对你有用。

    您可以创建具体的 EditingSupport 类并将其分配给您的列。它具有“canEdit”方法,您可以通过该方法动态控制编辑。

    所以你要做的就是从复选框状态中将布尔标志存储在模型中,或者直接读取复选框状态并返回 false/true 值,这将启用/禁用编辑。

    【讨论】:

    • 我已尝试编辑支持并分配给我的专栏,但它不起作用。根本不调用“canEdit”按钮。
    • “canEdit”按钮 ??我想你打错了。你试过放断点吗?将不得不查看代码以获得进一步的帮助。
    • 抱歉打错了。是的,我已经发布了上面的代码。我尝试使用断点并且树查看器不可点击,它不会超出该行: super(columnViewer);在我的 ProximityClustersEditingSupport 构造函数中
    • @anjalli。我可以看到您在 getCellEditor 方法中创建了新的 TextCellEditor() 。尽管您已经使用树作为父级在构造函数本身中创建了编辑器。所以只需以相同的方法返回编辑器。现在文本编辑器没有父级,因为您正在创建它的简单新实例。
    • 我忽略了这一点。我曾提到过“编辑”,但没有结果。现在调试发生,直到 this.editor = new TextCellEditor(treeViewer.getTree()) 并终止。这是我如何在 treeviewer 列中包含编辑支持的代码:proximityClustersColumn.setEditingSupport(new ProximityClustersEditingSupport(proximityClustersColumn.getViewer(), viewer));
    【解决方案3】:

    link 中的程序显示了所有可能的与树查看器相关的实现。将程序复制粘贴到一个新的 java 类中并作为 java 应用程序运行。这个例子解决了我在实现中遇到的所有与树相关的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      相关资源
      最近更新 更多