首页 > 解决方案 > 在 JGraphX 中可视化 JgraphT 图形的样式

问题描述

我正在尝试为使用 JgraphT 创建并使用 JGraphX 显示的图形设置单元格样式。我能够成功地为直接在 JGraphX 中创建的图形设置单元格样式。这是代码:

import javax.swing.JFrame;
import java.util.Hashtable;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.view.mxGraph;
import com.mxgraph.view.mxStylesheet;
import com.mxgraph.layout.hierarchical.mxHierarchicalLayout;
import com.mxgraph.util.mxConstants;



public class HelloWorld extends JFrame
{
    public HelloWorld()
    {
        super("Hello world!");

        mxGraph graph = new mxGraph();
        Object parent = graph.getDefaultParent();

        mxStylesheet stylesheet = graph.getStylesheet();
        Hashtable<String, Object> style = new Hashtable<>();
        style.put(mxConstants.STYLE_SHAPE, mxConstants.SHAPE_RECTANGLE);
        style.put(mxConstants.STYLE_FONTCOLOR, "#774400");
        style.put(mxConstants.STYLE_FILLCOLOR, "#FFFFFF");
        style.put(mxConstants.STYLE_STROKECOLOR, "#000000");
        //style.put(mxConstants.STYLE_ROUNDED, "true");
        stylesheet.putCellStyle("ROUNDED", style);

        graph.getModel().beginUpdate();
        try
        {
            Object v1 = graph.insertVertex(parent, null, "Hello", 20, 20, 100, 40, "ROUNDED");
            Object v2 = graph.insertVertex(parent, null, "world", 240, 150, 100, 40, "ROUNDED");
            Object v3 = graph.insertVertex(parent, null, "blargh", 240, 150, 100, 40, "ROUNDED");

            graph.insertEdge(parent, null, "Edge", v1, v2);
            graph.insertEdge(parent, null, "Edge", v1, v3);
        }
        finally
        {
            graph.getModel().endUpdate();
        }

        new mxHierarchicalLayout(graph).execute(graph.getDefaultParent());

        mxGraphComponent graphComponent = new mxGraphComponent(graph);
        getContentPane().add(graphComponent);
    }

    public static void main (String[] args)
    {
        HelloWorld frame = new HelloWorld();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 320);
        frame.setVisible(true);
    }
}

上面的结果是带有黑色文本的白色矩形单元格。现在我正在尝试对使用 JgraphT 创建并使用 JGraphX 显示的图形执行相同的操作。只有单元格样式,蓝色背景上的黑色文本,仍然是 JGraphX 默认样式。这是代码:

import javax.swing.JFrame;
import java.util.*;

import org.jgrapht.*;
import org.jgrapht.graph.*;
import org.jgrapht.io.*;
import org.jgrapht.ext.*;
import org.jgrapht.traverse.*;

import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.view.mxGraph;
import com.mxgraph.view.mxStylesheet;
import com.mxgraph.layout.hierarchical.mxHierarchicalLayout;
import com.mxgraph.util.mxConstants;
import com.mxgraph.model.*;



public class HelloWorld extends JFrame
{
    private JGraphXAdapter<String, DefaultEdge> jgxAdapter;

    public HelloWorld()
    {
        super("Hello world!");

        Graph<String, DefaultEdge> graph =
            new DefaultDirectedGraph<>(DefaultEdge.class);

        graph.addVertex("hello");
        graph.addVertex("world");
        graph.addVertex("blarg");

        graph.addEdge("hello", "world");
        graph.addEdge("hello", "blarg");

        jgxAdapter = new JGraphXAdapter(graph);

        mxStylesheet stylesheet = jgxAdapter.getStylesheet();
        Hashtable<String, Object> style = new Hashtable<>();
        style.put(mxConstants.STYLE_SHAPE, mxConstants.SHAPE_RECTANGLE);
        style.put(mxConstants.STYLE_FONTCOLOR, "#774400");
        style.put(mxConstants.STYLE_FILLCOLOR, "#FFFFFF");
        style.put(mxConstants.STYLE_STROKECOLOR, "#000000");
        stylesheet.putCellStyle("ROUNDED", style);

        new mxHierarchicalLayout(jgxAdapter).execute(jgxAdapter.getDefaultParent());        

        jgxAdapter.getModel().beginUpdate();

        try
        {
            HashMap<String, mxICell> cells = jgxAdapter.getVertexToCellMap();

            for(mxICell cell : cells.values())
            {
                cell.setStyle("strokeColor=red;fillColor=white;");
            }
        }
        finally
        {
            jgxAdapter.getModel().endUpdate();
        }

        mxGraphComponent graphComponent = new mxGraphComponent(jgxAdapter);
        getContentPane().add(graphComponent);
    }

    public static void main (String[] args)
    {
        HelloWorld frame = new HelloWorld();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 320);
        frame.setVisible(true);
    }
}

标签: javaswingjgraphtjgraphx

解决方案


推荐阅读