Prefuse示例图部分在JPanel之外

我想使用Prefuse来可视化图形。 我按照他们的教程尝试了他们的示例应用程序 它的源代码可以在这里找到

但是,即使我只是复制完整代码,结果图也不会显示在教程中。 它只有一半可见,卡在JPanel的左上角。 它的某些部分缺失,因为它们必须在面板外显示。 我尝试了一些自己的图表,但我仍然遇到同样的现象。

我想这不是预期的行为,但我不知道在哪里寻找问题。 我不知道这是Swing(x)还是prefuse或者……的问题?

更新:这是修订后的代码。 我没有从示例中做太多改变,只添加了trashgod建议的内容。

package visualise; import javax.swing.JFrame; import javax.swing.SwingUtilities; import prefuse.Constants; import prefuse.Display; import prefuse.Visualization; import prefuse.action.ActionList; import prefuse.action.RepaintAction; import prefuse.action.assignment.ColorAction; import prefuse.action.assignment.DataColorAction; import prefuse.action.layout.graph.ForceDirectedLayout; import prefuse.activity.Activity; import prefuse.controls.DragControl; import prefuse.controls.PanControl; import prefuse.controls.ZoomControl; import prefuse.data.Graph; import prefuse.data.io.DataIOException; import prefuse.data.io.GraphMLReader; import prefuse.render.DefaultRendererFactory; import prefuse.render.LabelRenderer; import prefuse.util.ColorLib; import prefuse.visual.VisualItem; public class PrefuseExample { public static void main(String[] argv) { SwingUtilities.invokeLater(new Runnable() { public void run() { // -- 1. load the data ------------------------------------------------ // load the socialnet.xml file. it is assumed that the file can be // found at the root of the java classpath Graph graph = null; try { graph = new GraphMLReader().readGraph("../../resources/visualisation/prefuse/Prefuse-master/data/socialnet.xml"); } catch ( DataIOException e ) { e.printStackTrace(); System.err.println("Error loading graph. Exiting..."); System.exit(1); } // -- 2. the visualization -------------------------------------------- // add the graph to the visualization as the data group "graph" // nodes and edges are accessible as "graph.nodes" and "graph.edges" Visualization vis = new Visualization(); vis.add("graph", graph); vis.setInteractive("graph.edges", null, false); // -- 3. the renderers and renderer factory --------------------------- // draw the "name" label for NodeItems LabelRenderer r = new LabelRenderer("name"); r.setRoundedCorner(8, 8); // round the corners // create a new default renderer factory // return our name label renderer as the default for all non-EdgeItems // includes straight line edges for EdgeItems by default vis.setRendererFactory(new DefaultRendererFactory(r)); // -- 4. the processing actions --------------------------------------- // create our nominal color palette // pink for females, baby blue for males int[] palette = new int[] { ColorLib.rgb(255,180,180), ColorLib.rgb(190,190,255) }; // map nominal data values to colors using our provided palette DataColorAction fill = new DataColorAction("graph.nodes", "gender", Constants.NOMINAL, VisualItem.FILLCOLOR, palette); // use black for node text ColorAction text = new ColorAction("graph.nodes", VisualItem.TEXTCOLOR, ColorLib.gray(0)); // use light grey for edges ColorAction edges = new ColorAction("graph.edges", VisualItem.STROKECOLOR, ColorLib.gray(200)); // create an action list containing all color assignments ActionList color = new ActionList(); color.add(fill); color.add(text); color.add(edges); // create an action list with an animated layout ActionList layout = new ActionList(Activity.INFINITY); layout.add(new ForceDirectedLayout("graph")); layout.add(new RepaintAction()); // add the actions to the visualization vis.putAction("color", color); vis.putAction("layout", layout); // -- 5. the display and interactive controls ------------------------- Display d = new Display(vis); d.setSize(720, 500); // set display size // drag individual items around d.addControlListener(new DragControl()); // pan with left-click drag on background d.addControlListener(new PanControl()); // zoom with right-click drag d.addControlListener(new ZoomControl()); // -- 6. launch the visualization ------------------------------------- // create a new window to hold the visualization JFrame frame = new JFrame("prefuse example"); // ensure application exits when window is closed frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(d); frame.pack(); // layout components in window frame.setVisible(true); // show the window // assign the colors vis.run("color"); // start up the animated layout vis.run("layout"); } }); } 

}

我是Prefuse的新手 ,但是一些常见的错误可能会导致观察到的问题。 看看这个例子 ,

  • 正如这里所讨论的,当你真的想要覆盖getPreferredSize()时,不要在Display上使用setSize() getPreferredSize()

  • 应该仅在事件派发线程上构造和操作Swing GUI对象。

  • 初始聚类是图形原点的一个人工制品,它位于点(0, 0)Display组件的左上角。 选择了首选尺寸后,可以将pan()移到中心。

图片

 private static final int W = 640; private static final int H = 480; … Display d = new Display(vis) { @Override public Dimension getPreferredSize() { return new Dimension(W, H); } }; d.pan(W / 2, H / 2);