我正在尝试保存JFace TreeViewer
扩展状态以在调用setInput()
方法后刷新它.我试过getExpandedElements
,setExpandedElements
,getExpandedTreePaths
,setExpandedTreePaths
的方法,TreeViewer
但它不工作.
Object[] expandedElements = viewer.getExpandedElements();
TreePath[] expandedTreePaths = viewer.getExpandedTreePaths();
viewer.setInput();
viewer.setExpandedElements(expandedElements);
viewer.setExpandedTreePaths(expandedTreePaths);
Run Code Online (Sandbox Code Playgroud) 我正在申请ViewerFilter
一棵树上的几棵树,但大多是树叶.过滤器确实适用于叶子,使用叶子内的属性.所有树枝都保持不变,以便它们的叶子可以出现.
但是我想过滤掉不包含选定叶子的分支,我可以看到其中没有ViewerFilter
允许这样的机制.
这有可能吗?
例如,给定下面的概念树(其中b
是分支,a L
是叶子)
b0
b1
L2
L4
L8
b2
L1
L3
L5
Run Code Online (Sandbox Code Playgroud)
我想申请一个ViewerFilter
只选择甚至包含叶子的树叶和树枝.结果树将是......
b0
b1
L2
L4
L8
Run Code Online (Sandbox Code Playgroud)
..分支b2
不显示,因为它不包含选定的子项,但分支b0
和b1
do.
我实际上有两个问题,但它们有点相关,所以在这里它们一样......
如何使用TreeViewer
(SWT.VIRTUAL
)和ILazeTreeContentProvider
?确保当前未显示的树节点的垃圾收集?如果一个节点有5000个子节点,一旦它们被观众显示,它们就永远不会被释放,因此如果你的树有大量的节点和叶子而且堆大小不够大,那么内存不足就会出错.是否有某种最佳实践如何避免内存泄漏,这是由于从未关闭的视图持有一个包含大量数据的树视图(数十万个对象甚至数百万)?也许有一些回调接口可以让观众/内容提供商提供更大的灵活性?
是否可以将deffered(DeferredTreeContentManager
)和lazy(ILazyTreeContentProvider
)加载组合为单个TreeViewer
(SWT.VIRTUAL
)?通过查看示例和API,我可以理解,只能在给定时间使用任何一个,但不能同时使用两者,例如,仅获取给定节点的可见子节点并使用Job在单独的线程中获取它们API.困扰我的是Deferred方法加载所有孩子.虽然在不同的线程中,您仍然会加载所有元素,即使一次只显示最小子集.
如果需要,我可以为我的问题提供代码示例...
我现在正在与自己挣扎,所以如果我能在此期间拿出一些东西,我很乐意在这里分享.
谢谢!
此致,Svilen
我将两个TreeViewers
放入 SWT Shell
。
他们每个人都有自己的滚动条。不过,我想只有一个Scrollbar
在Shell
其控制的滚动TreeViewers
同时。
我能够找到的唯一示例是在源比较视图中。但是,我看不出他们是如何做到这一点的——我已经尝试弄明白了一段时间。但至少我知道这是可能的。
有什么建议?
编辑
我的最终界面应该在左边有两个TreeViewers
和一个Scrollbar
来控制它们。
我在SWT / JFace技术方面还很陌生,但发现了一个令我抓狂的问题。在Eclipse RCP应用程序中,我有一个视图,其中放置了带有JFace TreeViewer的SWT树,该JFace TreeViewer通过标签提供程序提供标签和图标。根据客户的要求,树的背景颜色为深蓝色,字体颜色为白色。当选择了节点时,这种颜色组合会导致节点文本的可视化效果不佳,文本不适合树形区域,并且我们将鼠标指针放在节点上。以某种方式出现“本机突出显示”。可以在下图中显示。
另一方面,当未选择将鼠标放在其上的节点时,不会发生此问题。突出显示会更改字体的颜色以使其更加可见。可以在下图中显示。
经过一些研究,我发现通过为SWT.EraseItem
事件添加侦听器,我可以修改所选节点的背景颜色,然后禁用选择。这使我可以定义自己的选择背景样式,还可以禁用的SWT.SELECTED
标记,以event.detail
在未选择节点时强制OS突出显示。
private final class EraseItemListener implements Listener {
public void handleEvent(Event event) {
// Only perform the node highlight when it is selected.
if ((event.detail & SWT.SELECTED) == SWT.SELECTED) {
// Modify background, emulate Windows highlighting.
...
// Set Windows that we do not want to draw this item as a selection (we have already highlighted the item in our way).
event.detail &= ~SWT.SELECTED;
} …
Run Code Online (Sandbox Code Playgroud) 我创建了一个TreeViewer
使用JFace,但现在我必须向节点添加一个右键单击侦听器.右键单击完成后,必须显示如下菜单:
我试图这样做,但它抛出一个空指针异常.
MenuManager menuMgr = new MenuManager();
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager menuManager) {
IContributionManager menu = null;
MenuItem[] items = (MenuItem[]) menu.getItems();
for (int i = 0; i < items.length; i++)
items[i].dispose();
MenuItem itemCollectionFolder = new MenuItem((Menu) menu, SWT.NONE);
itemCollectionFolder.setText("Add Something" );
MenuItem itemNewTestCase = new MenuItem((Menu) menu, SWT.NONE);
itemNewTestCase.setText("Do Nothing" );
}
});
Control tree = treeViewer.getControl();
Menu menu = menuMgr.createContextMenu(tree);
tree.setMenu(menu);
Run Code Online (Sandbox Code Playgroud) 我认为这个问题很常见.
最近我有一个要求,我需要做一个水平或可扩展的表格视图.如果您需要一个示例,可以参考Mac OS X的活动监视器:
与此同时,我在这里尝试了一个例子,它满足了我的要求:
http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/SWTTreeWithMulticolumns.htm
但是它有一些问题:1.它使用SWT的Tree
类而不是JFace类; 2.我认为它需要重复实现一些JFace查看器类的功能,例如通过单击列标题,过滤器等进行排序.
当我感到绝望时,我发现Eclipse本身有一个完美的视图,它的"问题"视图:
所以我认为必须有一种优雅的方式,例如扩展JFace TableViewer
或TreeViewer
类.
但我需要帮助,因为我在谷歌搜索了很多没有好结果.:-(
我有和添加按钮,TableViewer
在我的应用程序中.按下" 添加"按钮后,我将向模型中添加一个新元素,然后刷新该查看器.
问题是:如何在我的查看器中选择这个新添加的项目?
我正在尝试创建Eclipse插件,它具有两个TreeViewer
并排的复合.点击每个TreeViewer
内容Eclipse属性视图应该提供适当的信息.现在我想为这个树视图设置选择提供程序,因此我使用了
setSelectionProvider(treeViewer1)
setSelectionProvider(treeviewer2)
Run Code Online (Sandbox Code Playgroud)
但是只有第二个添加的树形图才会被设置,因为第一个被覆盖.我正在从Queue.java类开始这两个treeviewer.因此我ISelectionProvider
在Queue.java上实现了如下界面:
public void addSelectionChangedListener(ISelectionChangedListener listener)
{
selectionChangedListeners.add(listener);
}
public void
removeSelectionChangedListener(ISelectionChangedListener listener)
{
selectionChangedListeners.remove(listener);
}
private void fireSelectionChanged(final SelectionChangedEvent event)
{
Object[] listeners = selectionChangedListeners.getListeners();
for (int i = 0; i < listeners.length; ++i)
{
final ISelectionChangedListener l =
(ISelectionChangedListener) listeners[i];
Platform.run(new SafeRunnable()
{
public void run()
{
l.selectionChanged(event);
}
@Override
public void handleException(Throwable e)
{
removeSelectionChangedListener(l);
}
});
}
}
public void setSelection(ISelection selection)
{
fireSelectionChanged(new SelectionChangedEvent(this, selection));
}
public …
Run Code Online (Sandbox Code Playgroud) 是否可以通过双击更改SWT/JFace的默认行为以启用单元格编辑?它现在的方式(单击)很难选择一个表行而不带文本字段.
这是一个自包含的代码段:
package table.editing;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
public class TableEditor extends ApplicationWindow {
class Element {
private String value;
public Element(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
public TableEditor() {
super(null);
setBlockOnOpen(true);
open();
Display.getCurrent().dispose();
}
protected …
Run Code Online (Sandbox Code Playgroud) 双击树项完全正常,但当我按下键盘上的CTRL + M然后树项展开\折叠,有人可以告诉我这背后的原因吗?这是Eclipse中的错误还是为什么当我按CTRL + M时会触发此双击功能.
谢谢.
我不熟悉RCP,事实上对java也是如此.有一个非常基本的问题.我有一个JFace TreeViewer
.我想扩展一个特定的节点.问题是我只有节点的名称.除此之外没有任何信息.我尝试使用treeItem,将其字符串与我拥有的节点名称进行比较,从而得到了节点.我尝试在树的contentprovider中扩展它.但我没有得到理想的输出.当我在日志中检查它时,我得到它被扩展但它没有在查看器中显示.我display.asyncExec
在contentprovider 中的方法中执行此操作.
我希望这个问题很清楚.
基本上,我正在使用Java中的Treeviewer(org.eclipse.jface.viewers.TreeViewer)。现在我的问题是,我想向现有结添加一个子元素/项。
首先,我的树看起来像这样:
Knot A
Knot B
Knot C
>child1
>child2
Run Code Online (Sandbox Code Playgroud)
这些child(child1,child2)arent是手动添加的,它们是在我接触到树本身之前生成的。
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL);
我填充了treeviewer:
viewer.setInput(....elements());
从上面生成状态。
viewer.getTree().getItem(0)
返回我的树的正确结A。
但是我不能在现有的结上添加新的孩子。我尝试了以下操作和其他操作:
TreeItem newItem = new TreeItem(items[0], SWT.NONE); and
viewer.add(items[0], newItem); with a newly created item
viewer.refresh();
从理论上讲,我可以操作arrayList,它首先会填充treeviewer,但是我认为那真的很糟糕。
我真的不知道我现在在做什么错。我想这是一个很愚蠢的问题。如果是这样,那么我很抱歉。^^
感谢您的帮助,对于您能提供的每一个提示,我深表感谢。
treeviewer ×13
jface ×12
java ×9
swt ×8
eclipse ×3
tree ×2
e4 ×1
eclipse-rcp ×1
scrollbar ×1
tableviewer ×1
treeview ×1