所有节点都聚集在一个地方——GraphStream-JAVA

所有节点都聚集在一个地方——GraphStream-JAVA,java,swing,jpanel,graphstream,Java,Swing,Jpanel,Graphstream,我正在为java开发库。但我在这里面临一个问题。 当我试图从DB表中获取节点时,它会在JPanel上显示数据和边缘,但首先,当程序启动时,它会将所有节点聚集在一个地方,如下图所示。因此,我必须拖动所有节点。 为什么会这样?任何小小的暗示都将不胜感激 这是我的密码: public class GraphExplore { static Connection conn2; static String result, result2; static int totalRows

我正在为java开发库。但我在这里面临一个问题。 当我试图从DB表中获取节点时,它会在JPanel上显示数据和边缘,但首先,当程序启动时,它会将所有节点聚集在一个地方,如下图所示。因此,我必须拖动所有节点。 为什么会这样?任何小小的暗示都将不胜感激

这是我的密码:

public class GraphExplore {
    static Connection conn2;
    static String result, result2;
    static int totalRows, i;

    public static void main(String args[]) throws SQLException {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    showData();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private static void showData() throws SQLException {

        JFrame frame = new JFrame();
        frame.setBounds(30, 50, 1300, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new GridLayout()){
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(640, 480);
            }
        };
        panel.setBorder(BorderFactory.createLineBorder(Color.blue, 5));
        Graph graph = new SingleGraph("Tutorial", false, true);

        try {
            Class.forName("org.h2.Driver");
            conn2 = DriverManager.getConnection("jdbc:h2:file:G:/hs_data/h2_db/test", "sa", "sa");

        } catch (Exception e) {
            e.printStackTrace();
        }
        Statement stmt2 = conn2.createStatement();
        ResultSet rs = stmt2.executeQuery("SELECT count(*) FROM cdr");
        while (rs.next()) {
            totalRows = rs.getInt(1);
        }
        ResultSet rs2 = stmt2.executeQuery("SELECT ANUMBER,BNUMBER FROM CDR LIMIT 1000");
        while (rs2.next()) {
            result = rs2.getString("ANUMBER");
            result2 = rs2.getString("BNUMBER");
            graph.addNode(result);
            graph.addNode(result2);
            for (i = 0; i < 1000; i++)
                graph.addEdge("string" + i, result, result2);
        }

        Viewer viewer = new Viewer(graph, Viewer.ThreadingModel.GRAPH_IN_GUI_THREAD);
        ViewPanel viewPanel = viewer.addDefaultView(false);
        panel.add(viewPanel);
        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        for (Node node : graph) {
            node.addAttribute("ui.label", node.getId());
        }

        }

}
公共类GraphExplore{
静态连接conn2;
静态字符串结果,result2;
静态整数行,i;
公共静态void main(字符串args[])引发SQLException{
invokeLater(新的Runnable(){
公开募捐{
试一试{
showData();
}捕获(SQLE异常){
e、 printStackTrace();
}
}
});
}
私有静态void showData()引发SQLException{
JFrame=新JFrame();
机架立根(30、50、1300、600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel=newjpanel(newgridlayout()){
@凌驾
公共维度getPreferredSize(){
返回新维度(640480);
}
};
panel.setboorder(BorderFactory.createLineBorder(Color.blue,5));
图形=新的单图形(“教程”,假,真);
试一试{
Class.forName(“org.h2.Driver”);
conn2=DriverManager.getConnection(“jdbc:h2:file:G:/hs_data/h2_db/test”、“sa”、“sa”);
}捕获(例外e){
e、 printStackTrace();
}
语句stmt2=conn2.createStatement();
ResultSet rs=stmt2.executeQuery(“从cdr中选择计数(*));
while(rs.next()){
totalRows=rs.getInt(1);
}
ResultSet rs2=stmt2.executeQuery(“从CDR LIMIT 1000中选择一个编号,b编号”);
while(rs2.next()){
结果=rs2.getString(“ANUMBER”);
result2=rs2.getString(“BNUMBER”);
graph.addNode(结果);
graph.addNode(result2);
对于(i=0;i<1000;i++)
添加图形(“字符串”+i,结果,结果2);
}
Viewer-Viewer=新查看器(图形,Viewer.ThreadingModel.graph\u在GUI\u线程中);
ViewPanel ViewPanel=viewer.addDefaultView(false);
panel.add(视图面板);
框架。添加(面板);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
用于(节点:图形){
addAttribute(“ui.label”,node.getId());
}
}
}
在此之前,我使用的是
graph.display()
,它工作得很好,但当我将graph面板添加到自定义JPanel中时,它开始像这样工作

试试这个:

   viewer.enableAutoLayout();

在取消自动布局的标记后尝试此功能:

//可删除的自动布局
viewer.disableAutoLayout();
//设置随机节点位置
setNodePositions();
其中,函数setNodePositions()定义如下:

private void setNodePositions(){
随机r=新随机();
for(节点:graph.getNodeSet()){
如果(!node.hasAttribute(“xyz”)){
node.addAttribute(“xyz”,r.nextInt(x_max),r.nextInt(y_max),0);
}
}                                
}
x_max和y_max是面板的宽度和高度