【问题标题】:GraphStream 2.0 - Mouse pointer offset when dragging nodesGraphStream 2.0 - 拖动节点时鼠标指针偏移
【发布时间】:2021-02-13 16:55:07
【问题描述】:

我是 GraphStream 的新手,并且已经构建了一个最小的应用程序,其中 GraphStream 2.0 图形嵌入到了 Swing 应用程序中。

在我的应用程序中,当我尝试拖动节点时,鼠标指针显然偏移了大约一半的面板大小(垂直和水平)。

这是代码:

package gstest;

import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

import org.graphstream.graph.Graph;
import org.graphstream.graph.Node;
import org.graphstream.graph.implementations.SingleGraph;
import org.graphstream.ui.layout.Layout;
import org.graphstream.ui.layout.springbox.implementations.SpringBox;
import org.graphstream.ui.swing_viewer.DefaultView;
import org.graphstream.ui.swing_viewer.SwingViewer;
import org.graphstream.ui.view.Viewer;

public class GSTest {
    
    private static void createAndShowGUI() {

        JFrame frame = new JFrame("GS Test");
        frame.setMinimumSize(new Dimension(1000, 500));
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new GridLayout(1, 1));
        
        frame.getContentPane().add(makeMainPanel());
    }
    
    private static JPanel makeMainPanel() {
        System.setProperty("org.graphstream.ui.renderer", "org.graphstream.ui.j2dviewer.J2DGraphRenderer");
        
        Layout graphLayout = new SpringBox(false);
        Graph graph = new SingleGraph("embedded");
        SwingViewer viewer = new SwingViewer(graph, Viewer.ThreadingModel.GRAPH_IN_GUI_THREAD);
        
        JPanel graphPanel = new JPanel();

        DefaultView view = (DefaultView) viewer.addDefaultView(false);
        view.setPreferredSize(new Dimension(980, 460));
        
        graph.addSink(graphLayout);
        graphLayout.addAttributeSink(graph);
        graph.setAttribute("ui.quality");
        graph.setAttribute("ui.antialias");
        
        for (int i = 0; i < 10; i++) {
            Node n = graph.addNode(String.valueOf(i));
            n.setAttribute("ui.style", "shape: box;");
            n.setAttribute("ui.style", "size: 50px,30px;");
            n.setAttribute("ui.style", "fill-color: blue;");
        }
        
        graphLayout.compute();  
        
        graphPanel.add(view);

        return graphPanel;
    }
    
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

}

下图为拖动中心矩形节点时鼠标指针的位置(红色圈出)。

关于这个问题的原因有什么想法吗?

编辑:

这是一个显示问题的简短 GIF 动画(显示的应用程序是上面的代码):

【问题讨论】:

    标签: java graphstream


    【解决方案1】:

    您不使用 Graphstream 2.0。通用查看器 J2DGraphRenderer :

    System.setProperty("org.graphstream.ui.renderer", "org.graphstream.ui.j2dviewer.J2DGraphRenderer"); 
    

    不再使用,现在使用(取决于您的 UI):

    System.setProperty("org.graphstream.ui", "swing"); //For swing interface
    System.setProperty("org.graphstream.ui", "javafx"); //For javafx interface
    

    您可以在官方website找到更多信息。 不要忘记查看示例:https://github.com/graphstream/gs-ui-swing/tree/2.0/src-test/org/graphstream/ui/viewer_swing/test

    【讨论】:

    • 感谢您的提示,但它不会影响所描述的行为。我按照您的建议更改了系统属性,但没有效果。
    • 我尝试了您提到的一些示例,并且鼠标偏移也存在于此处。例如。 TestFreeplane演示允许选择图形的部分,并在蓝色选择工作中显示所选部件,但是,如所描述的偏移量,即在窗口框的右下角选择矩形时,图形的一部分被标记为蓝色,大致位于框架的中心。似乎是比较基础的 GraphStream 问题,与具体应用无关。
    • 我发布了另一个答案,应该是这样。不过,我对 TestFreePlane 没有问题。祝你好运
    【解决方案2】:

    好的,我想我明白你的问题了。与here 描述的相同。您用面板替换了框架的内容,因此视图面板无法获得正确的坐标。这个问题在摇摆中不太常见。您可以在函数结束时轻松防止这种情况:

    graphPanel.add(view);
    
    JPanel content = new JPanel();
    content.add(graphPanel);
    return content;
    

    【讨论】:

    • 我按照您的建议添加了一个额外的封闭JPanel,但是当我尝试用鼠标指针拖动节点时仍然存在偏移。
    • 我尝试了完全相同的代码并且它工作正常,所以我不知道更多了,对不起。尝试查看您的依赖项。
    • 感谢您的努力。我将尝试在不同的机器/VM 上运行代码。 (注意:为了说明问题,我在原始问题中添加了动画 GIF。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2016-01-07
    相关资源
    最近更新 更多