gpt4 book ai didi

java - 预熔 : Organizing edges for clarity

转载 作者:太空宇宙 更新时间:2023-11-04 10:13:25 26 4
gpt4 key购买 nike

我正在 Java/Eclipse 中处理我的个人家谱,并且很高兴地遇到了关于图形表示的 prefuse。到目前为止,结果看起来对于我的数据库提要来说是足够的,但我仍然缺少使其更易于浏览的关键点。

第1点:顶点代表一个人或一个联合,我的图是从年长的成员指向年轻的成员。这通过边缘上的箭头反射(reflect)出来。然而,我只想将箭头按一个方向分组(如果您愿意,我正在尝试将几代人分组在一起),但我无法开始找到如何做到这一点。有关信息,我现在正在使用 NodeLinkTreeLayout。

第 2 点:除了图表本身之外,我的应用程序主窗口还包含第二个 JPanel,我想在其中修改/插入成员。所以我想向每个节点添加一个操作来调用第二个 JPanel 中的过程。到目前为止,我对如何从节点访问java类的研究还没有定论,似乎starter prefuse包中的所有示例都仅基于图形交互。

就在那里。您可能已经明白,我对 prefuse 很陌生,而且不是 Java 专业人士。因此,任何评论/指示/建议将不胜感激。我将添加一个屏幕和我的图形代码,以便您可以看到可以做得更好的地方。

感谢您的宝贵时间,并期待阅读您的见解。约兰

Graph Sample

public class ShowGraph extends Display {

public static final String EDGES = "graph.edges";

public ShowGraph() {
super(new Visualization());
Graph mG = FamGraph.getGraph();

m_vis.addGraph("graph", mG);
m_vis.setInteractive("graphe.edges", null, false);
m_vis.setValue("graph.nodes", null, VisualItem.SHAPE, new Integer(Constants.SHAPE_ELLIPSE));

EdgeRenderer edgeR = new EdgeRenderer(Constants.EDGE_TYPE_CURVE, Constants.EDGE_ARROW_FORWARD);
LabelRenderer nodeR = new LabelRenderer("name");
nodeR.setRoundedCorner(8, 8);
nodeR.setHorizontalAlignment(Constants.LEFT);

DefaultRendererFactory drf = new DefaultRendererFactory();
drf.setDefaultRenderer(nodeR);
drf.setDefaultEdgeRenderer(edgeR);

m_vis.setRendererFactory(drf);


int[] palette = new int[] {
ColorLib.rgb(255, 180, 180), ColorLib.rgb(190, 190, 255)
};
DataColorAction nFill = new DataColorAction("graph.nodes", "label", Constants.NOMINAL, VisualItem.FILLCOLOR, palette);
ColorAction edges = new ColorAction("graph.edges", VisualItem.STROKECOLOR, ColorLib.gray(230));
ColorAction arrow = new ColorAction("graph.edges", VisualItem.FILLCOLOR, ColorLib.gray(230));
ColorAction text = new ColorAction("graph.nodes", VisualItem.TEXTCOLOR, ColorLib.gray(0));

ActionList color = new ActionList();
color.add(nFill);
color.add(edges);
color.add(arrow);
color.add(text);

ActionList layout = new ActionList(Activity.INFINITY);
//layout.add(new ForceDirectedLayout("graph", true));
layout.add(new NodeLinkTreeLayout("graph"));
layout.add(new RepaintAction());

m_vis.putAction("color", color);
m_vis.putAction("layout", layout);

setSize(1200, 900); //size controlled by parent jpanel - Comment out after tests
pan(360, 250);
setHighQuality(true);
addControlListener(new DragControl());
addControlListener(new PanControl());
addControlListener(new ZoomControl());
addControlListener(new ZoomToFitControl());

m_vis.run("color");
m_vis.run("layout");
}

public static void main(String[] args) {
Fulltree.fireUp();
ShowGraph mG = new ShowGraph();
JFrame frame = new JFrame("My family chart");
JPanel thePanel = new JPanel();
frame.getContentPane().add(thePanel);
thePanel.add(mG);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}

}

最佳答案

因此,经过大量研究后,我正在回答自己的问题,以防有人遇到同样的问题:

  • 对于第 1 点:ForceDirectedGraph 比 NodeLinkTreeLayout 好很多,尤其是当您的图表开始计算许多成员时。家族分支比世代相守更有意义。

  • 至于第 2 点:与节点相关的操作是通过 ControlListener 实现的方法:

    addControlListener(new ControlAdapter() {
    public void itemClicked(VisualItem item, MouseEvent e) {
    // anything you need here
    // even filter right and left click for a sub menu
    }
    });

还有一件事:如果您向图表添加操作(搜索、谓词...),请确保在某个时候需要重建图表时停止它们。如果不这样做,您的操作将产生错误,您将花费数小时(如果不是数天)来调试。

关于java - 预熔 : Organizing edges for clarity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52039877/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com