如何获得相对于向导的控制边界

时间:2020-12-30 22:24:38

I hope I can explain my problem. I am working on a dialog that can contain number of trees from left side, and one tree from right side. I need to draw a line from left to right, but for some reason, I am getting the same tree item bounds. For example, when the first item is selected in tree one it will return the same bounds location for the first item in tree two. How do I get item bounds relative to the wizard and not to the composite.

我希望我能解释一下我的问题。我正在开发一个对话框,可以包含左侧的树木数量和右侧的一棵树。我需要从左到右画一条线,但由于某种原因,我得到了相同的树项边界。例如,当在树1中选择第一个项时,它将返回树2中第一个项的相同边界位置。如何获取相对于向导而不是复合的项目界限。

Here is the code:

这是代码:

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TreeItem;

public class SWTSashForm
{
    public static void main (String [] args) {
        Display display = new Display ();
        Shell shell = new Shell(display);

        shell.setLayout(new FillLayout());

        SashForm sashForm = new SashForm(shell, SWT.HORIZONTAL);


        Composite composite = new Composite(sashForm, SWT.NONE);
        composite.setLayout(new GridLayout());
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
        composite.setBackground(ColorConstants.white);


        for (int i = 0; i < 3; i++) {

            Label lbl = new Label(composite, SWT.NONE);
            lbl.setText("Tree " + i);

            // Configure scrolled composite
            ScrolledComposite scrolledComposite = new ScrolledComposite(composite, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
            scrolledComposite.setLayout(new GridLayout());
            scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
            scrolledComposite.setExpandVertical(true);
            scrolledComposite.setExpandHorizontal(true);
            scrolledComposite.setAlwaysShowScrollBars(true);
            scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));

            // Add content to scrolled composite
            Composite scrolledContent = new Composite(scrolledComposite, SWT.NONE);
            scrolledContent.setLayout(new GridLayout());
            GridData gridData = new GridData();
            gridData.horizontalAlignment = SWT.FILL;
            gridData.grabExcessHorizontalSpace = true;
            gridData.verticalAlignment = SWT.FILL;
            gridData.grabExcessVerticalSpace = true;
            scrolledContent.setLayoutData(gridData);
            scrolledComposite.setContent(scrolledContent);

            final TreeViewer tree = new TreeViewer(scrolledContent);
            for(int loopIndex0 = 0; loopIndex0 < 10; loopIndex0++) {
                TreeItem treeItem0 = new TreeItem(tree.getTree(), 0);
                treeItem0.setText("Level 0 Item "+ loopIndex0);

                for(int loopIndex1 = 0; loopIndex1 < 10; loopIndex1++) {
                    TreeItem treeItem1 = new TreeItem(treeItem0, 0);
                    treeItem1.setText("Level 1 Item "+ loopIndex1);

                    for(int loopIndex2 = 0; loopIndex2 < 10; loopIndex2++) {
                        TreeItem treeItem2 = new TreeItem(treeItem1, 0);
                        treeItem2.setText("Level 2 Item "+ loopIndex2);
                    }
                }
            }
            tree.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));


            tree.getTree().addListener(SWT.Selection, new Listener() {
                public void handleEvent(Event e) {
                    TreeItem[] selection = tree.getTree().getSelection();
                    for (int i = 0; i < selection.length; i++){
                        TreeItem item = selection[i];
                        Rectangle bounds = item.getBounds();
                        System.out.println("Tree item bounds y " + bounds.y  );
                    }
                } });
        }
        new TreeViewer(sashForm);
        shell.open();

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

}

1 个解决方案

#1


2  

The item bounds is always relative to the parent tree.

项边界始终相对于父树。

You can convert the position to be relative to the display using:

您可以使用以下方法将位置转换为相对于显示:

Point displayPos = tree.getTree().toDisplay(bounds.x, bounds.y);

and then convert this position to be relative to another control (such as your shell) using:

然后使用以下命令将此位置转换为相对于另一个控件(例如shell)

Point pos = shell.toControl(displayPos);

#1


2  

The item bounds is always relative to the parent tree.

项边界始终相对于父树。

You can convert the position to be relative to the display using:

您可以使用以下方法将位置转换为相对于显示:

Point displayPos = tree.getTree().toDisplay(bounds.x, bounds.y);

and then convert this position to be relative to another control (such as your shell) using:

然后使用以下命令将此位置转换为相对于另一个控件(例如shell)

Point pos = shell.toControl(displayPos);