10

我已经使用 Zest GraphViewer 一个多星期了,现在试图发现它可以为我的应用程序做些什么,但到目前为止,我还不能让它的行为符合我的要求。

我希望有人能指出我需要的资源,因为我找不到谷歌的所有用处,或者可以告诉我我想要的是否可行。

版本

我在 RCP 项目的依赖项中有 Zest core 1.3.0 和 Zest layout 1.1.0。这来自我从 Zest 站点获取的下载站点。

要求

  • 单节点/边缘选择。
  • 选择空白时取消选择节点/边缘(这可能是一个错误?)
  • 右键单击功能以在节点上进行更改。(检测鼠标何时在节点上)

右键单击功能可能来自单一选择,因为我可以在任何地方弹出弹出窗口,但它基于当前选定的节点,但我宁愿不这样做。

由于性质或我们的应用程序和用户的原因,无法做到这一点,我可能还需要找到另一个具有此功能的基于 RCP/SWT 的图形绘图包。

任何对这些问题的帮助将不胜感激。

格伦 x

4

1 回答 1

6

基于Vogella 的 Zest 教程,我想出了这个:

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

    final Graph graph = new Graph(shell, SWT.NONE);
    GraphNode node1 = new GraphNode(graph, SWT.NONE, "Jim");
    GraphNode node2 = new GraphNode(graph, SWT.NONE, "Jack");
    GraphNode node3 = new GraphNode(graph, SWT.NONE, "Joe");
    GraphNode node4 = new GraphNode(graph, SWT.NONE, "Bill");

    /* Context menu */
    graph.addMenuDetectListener(new MenuDetectListener()
    {
        @Override
        public void menuDetected(MenuDetectEvent e)
        {
            Point point = graph.toControl(e.x, e.y);
            IFigure fig = graph.getFigureAt(point.x, point.y);

            if (fig != null)
            {
                Menu menu = new Menu(shell, SWT.POP_UP);
                MenuItem exit = new MenuItem(menu, SWT.NONE);
                exit.setText("Hello! This is " + ((GraphLabel) fig).getText());
                menu.setVisible(true);
            }
            else
            {
                Menu menu = new Menu(shell, SWT.POP_UP);
                MenuItem exit = new MenuItem(menu, SWT.NONE);
                exit.setText("Nothing here...");
                menu.setVisible(true);
            }
        }
    });
    /* Lets have a directed connection */
    new GraphConnection(graph, ZestStyles.CONNECTIONS_DIRECTED, node1, node2);
    /* Lets have a dotted graph connection */
    new GraphConnection(graph, ZestStyles.CONNECTIONS_DOT, node2, node3);
    /* Standard connection */
    new GraphConnection(graph, SWT.NONE, node3, node1);
    /* Change line color and line width */
    GraphConnection graphConnection = new GraphConnection(graph, SWT.NONE, node1, node4);
    graphConnection.changeLineColor(shell.getDisplay().getSystemColor(SWT.COLOR_GREEN));
    /* Also set a text */
    graphConnection.setText("This is a text");
    graphConnection.setHighlightColor(shell.getDisplay().getSystemColor(SWT.COLOR_RED));
    graphConnection.setLineWidth(3);

    graph.setLayoutAlgorithm(new SpringLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING), true);
    graph.addSelectionListener(new SelectionAdapter()
    {
        @Override
        public void widgetSelected(SelectionEvent e)
        {
            System.out.println(e.item);
            /* Make sure that only the newest item is selected */
            graph.setSelection(new GraphItem[]{(GraphItem)e.item});
        }

    });

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

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

它支持单节点/边缘选择、取消选择和按要求右键单击功能。

看起来像这样:

在此处输入图像描述


如果您使用本GraphViewer教程的示例并将其添加到View代码中,它仍然可以正常工作:

final Graph graph = viewer.getGraphControl();
graph.addSelectionListener(new SelectionAdapter()
{
    @Override
    public void widgetSelected(SelectionEvent e)
    {
        System.out.println(e.item);
        graph.setSelection(new GraphItem[]{(GraphItem)e.item});
    }

});
于 2014-02-14T13:03:28.270 回答