java - 在 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);
}
}
解决方案
推荐阅读
- r - 在列表上应用应用函数
- database-design - Mysql 数据库设计销售报告
- asp.net - 如何生成包含登录用户 ID 的连接字符串
- c - 使用宏时出现 gcc 错误:预期为 ',' 或 ';'
- sql - ForEach ADO 枚举器中的 ssis 截断表
- javascript - Next.js - 动态图像
- x86 - 为什么 adox 和 adcx 在 Ryzen 上不能很好地配合使用?
- python - 如何在文件夹中使用文件夹中的齿轮
- ruby-on-rails - 如何将 stylesheet_link_tag 与 sprockets 4 一起使用?
- sql - 选择中的默认值 - SQL