使用预设区域创建的 SWT TreeCursor 小部件
SWT TreeCursor widget created with a preset area
请参阅Attachment_TreeCursor。
TreeCursor 是为 FormPage 中的树创建的(对于 FormEditor)。
创建表单编辑器:
package test.treecursor.handlers;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.editor.FormEditor;
public class TestEditor extends FormEditor {
private TestEditorPage page;
@Override
protected Composite createPageContainer(final Composite parent) {
return super.createPageContainer(parent);
}
@Override
protected void addPages() {
try {
this.page = new TestEditorPage(this);
addPage(this.page);
}
catch (PartInitException e) {
e.printStackTrace();
}
}
@Override
public void doSave(final IProgressMonitor monitor) {
}
@Override
public void doSaveAs() {
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
}
创建表单页面:
package test.treecursor.handlers;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeCursor;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormPage;
public class TestEditorPage extends FormPage {
public TestEditorPage(final TestEditor testEditor) {
super(testEditor, "1", "MyTitle");
}
@Override
protected void createFormContent(final IManagedForm managedForm) {
Composite composite = managedForm.getForm().getBody();
composite.setLayout(new GridLayout());
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
Tree tree = createTree(composite);
createTreeColumns(tree);
final TreeCursor cursor = new TreeCursor(tree, SWT.BORDER);
}
private Tree createTree(final Composite composite) {
Tree tree = new Tree(composite, SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
tree.setLayout(composite.getLayout());
tree.setLayoutData(composite.getLayoutData());
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
return tree;
}
private void createTreeColumns(final Tree tree) {
TreeColumn column1 = new TreeColumn(tree, SWT.LEFT);
column1.setText("First column");
column1.setWidth(300);
TreeColumn column2 = new TreeColumn(tree, SWT.LEFT);
column2.setText("Second column");
column2.setWidth(300);
}
}
将此编辑器添加到编辑器扩展点:org.eclipse.ui.editors
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
point="org.eclipse.ui.editors">
<editor
class="test.treecursor.handlers.TestEditor"
default="false"
id="test.treecursor.editor1"
name="TestEditor">
</editor>
</extension>
</plugin>
如果我将 SWT 样式设置为 SWT.TRANSPARENT,我将不再看到此 'patch',但我仍然无法 select 该区域中树中的行。
看起来光标是从其 Form/ScrollableForm 的父组合中拾取这个大小的。在 tree.getDisplay() 的显示对象上,我可以看到字段 RECT clickRect 具有左、右、下和上的值。可以选择这些来创建游标吗?我怎样才能摆脱这个?
我发现 createTree
方法中有 2 个问题:
tree.setLayout(composite.getLayout());
:在Tree
上设置布局没有意义;布局对于正确定位子项很有用,但在 Tree
中你不必这样做;这也在 Tree
documentation:
中指定
Note that although this class is a subclass of Composite, it does not
normally make sense to add Control children to it, or set a layout on
it
因此您应该删除该指令。
tree.setLayoutData(composite.getLayoutData());
:您正在尝试 re-use Composite
的 GridData
,您不能那样做;来自 GridData
documentation:
NOTE: Do not reuse GridData objects. Every control in a Composite that
is managed by a GridLayout must have a unique GridData object.
您应该创建另一个 GridData
对象以仅在 Tree
.
中使用
解决这些问题后,您看到的区域应该会消失。
请参阅Attachment_TreeCursor。 TreeCursor 是为 FormPage 中的树创建的(对于 FormEditor)。
创建表单编辑器:
package test.treecursor.handlers;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.editor.FormEditor;
public class TestEditor extends FormEditor {
private TestEditorPage page;
@Override
protected Composite createPageContainer(final Composite parent) {
return super.createPageContainer(parent);
}
@Override
protected void addPages() {
try {
this.page = new TestEditorPage(this);
addPage(this.page);
}
catch (PartInitException e) {
e.printStackTrace();
}
}
@Override
public void doSave(final IProgressMonitor monitor) {
}
@Override
public void doSaveAs() {
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
}
创建表单页面:
package test.treecursor.handlers;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeCursor;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormPage;
public class TestEditorPage extends FormPage {
public TestEditorPage(final TestEditor testEditor) {
super(testEditor, "1", "MyTitle");
}
@Override
protected void createFormContent(final IManagedForm managedForm) {
Composite composite = managedForm.getForm().getBody();
composite.setLayout(new GridLayout());
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
Tree tree = createTree(composite);
createTreeColumns(tree);
final TreeCursor cursor = new TreeCursor(tree, SWT.BORDER);
}
private Tree createTree(final Composite composite) {
Tree tree = new Tree(composite, SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
tree.setLayout(composite.getLayout());
tree.setLayoutData(composite.getLayoutData());
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
return tree;
}
private void createTreeColumns(final Tree tree) {
TreeColumn column1 = new TreeColumn(tree, SWT.LEFT);
column1.setText("First column");
column1.setWidth(300);
TreeColumn column2 = new TreeColumn(tree, SWT.LEFT);
column2.setText("Second column");
column2.setWidth(300);
}
}
将此编辑器添加到编辑器扩展点:org.eclipse.ui.editors
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
point="org.eclipse.ui.editors">
<editor
class="test.treecursor.handlers.TestEditor"
default="false"
id="test.treecursor.editor1"
name="TestEditor">
</editor>
</extension>
</plugin>
如果我将 SWT 样式设置为 SWT.TRANSPARENT,我将不再看到此 'patch',但我仍然无法 select 该区域中树中的行。 看起来光标是从其 Form/ScrollableForm 的父组合中拾取这个大小的。在 tree.getDisplay() 的显示对象上,我可以看到字段 RECT clickRect 具有左、右、下和上的值。可以选择这些来创建游标吗?我怎样才能摆脱这个?
我发现 createTree
方法中有 2 个问题:
中指定tree.setLayout(composite.getLayout());
:在Tree
上设置布局没有意义;布局对于正确定位子项很有用,但在Tree
中你不必这样做;这也在Tree
documentation:Note that although this class is a subclass of Composite, it does not normally make sense to add Control children to it, or set a layout on it
因此您应该删除该指令。
tree.setLayoutData(composite.getLayoutData());
:您正在尝试 re-useComposite
的GridData
,您不能那样做;来自GridData
documentation:NOTE: Do not reuse GridData objects. Every control in a Composite that is managed by a GridLayout must have a unique GridData object.
您应该创建另一个
GridData
对象以仅在Tree
. 中使用
解决这些问题后,您看到的区域应该会消失。