【问题标题】:TableViewer selection changingTableViewer 选择更改
【发布时间】:2012-12-07 10:16:24
【问题描述】:

我有一个小问题,我正在寻求帮助。

我的 Master 部分中有一个 TableViewer,并且有很多条目会很快更新它。 我的详细信息页面显示所选项目信息。 我想让这个详细信息页面持久化,并且只在选择发生变化时收到通知。

我面临的问题是,当向 tableviewer 添加新项目时,选择会自动更改。

编辑:我有一个更新 TableViewer 的处理程序,在列表的开头添加一个新项目,这是我的 TableViewer 的输入。

TableViewerSWT.VIRTUAL 时,选择在索引上,当添加项目时,所选行相同,但项目已移动。

TableViewer 不是SWT.VIRTUAL 时,选择发生在对象上,但性能非常低!

有什么建议吗? 谢谢

public void update(Object obj_p) {
    if (obj_p instanceof IMessageEvent) {
        IMessageEvent event = (IMessageEvent) obj_p;
        synchronized (_currentListEvents) {
            _currentListEvents.addFirst(event);
            if (_currentListEvents.size() > _maxEvents) {
                _currentListEvents.removeLast();
            }
        }
    }
    if (null == obj_p) {
        synchronized (_currentListEvents) {
            _currentListEvents.clear();
        }
    }
}

【问题讨论】:

  • 向 tableviewer 添加新项目时,选择更改事件不会自动发生。你如何添加这个新项目?
  • 我将它添加到 update() 方法中。事实是,当我的 TableViewer 不是 SWT.VIRTUAL 时,选择不会改变。
  • 你能在这里发布一些代码吗?尤其是向 TableViewer 添加新项目时的部分。
  • 现在我明白了,这真的很有趣。我会调查的。

标签: java block jface master-detail tableviewer


【解决方案1】:

创建 TableViewer 时使用 SWT.FULL_SELECTION 样式。

有一个简单的可运行代码。它的行为与您发布的完全一样,选择正在更改,但是当您使用注释的 TableViewer 构造函数时,它对我有用。

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class TestCase {

private static List<String> model = new ArrayList<String>();
private static TableViewer viewer;

public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

//  viewer = new TableViewer(shell, SWT.SINGLE | SWT.FULL_SELECTION |    SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL);
    viewer = new TableViewer(shell, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL);

    viewer.getTable().setHeaderVisible(true);
    viewer.getTable().setLinesVisible(true);
    viewer.setUseHashlookup(true);

    viewer.setContentProvider(ArrayContentProvider.getInstance());
    viewer.setLabelProvider(new LabelProvider());

    model.add("element2");
    model.add("element1");
    model.add("element0");

    viewer.setInput(model);

    viewer.setSelection(new StructuredSelection(model.get(1)));

    viewer.addSelectionChangedListener(new ISelectionChangedListener() {

        @Override
        public void selectionChanged(SelectionChangedEvent event) {
            System.out.println("selection changed");
        }
    });

    addContent();

    shell.setSize(400, 400);
    shell.open();

    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
}

private static void addContent() {
    Display.getCurrent().timerExec(2000, new Runnable() {

        @Override
        public void run() {
            model.add(0, "element" + model.size());
            viewer.refresh();
            addContent();
        }
    });
}

}

【讨论】:

  • thx 但 SWT.FULL_SELECTION 是一次选择所有列,顺便说一下我的 TableViewer 一直是 SWT.FULL_SELECTION。
  • 我知道确实如此,但是使用这种样式时,它会保留选择。没有它,选择总是会像你提到的那样改变。
  • TableViewer 为 SWT.VIRTUAL 时不保留选择
  • 我运行了您的示例,即使带有注释行,也不会为我保留选择
  • Windows XP 专业服务包 3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2013-03-03
  • 1970-01-01
相关资源
最近更新 更多