Java 在jgraph中随机化顶点的放置

Java 在jgraph中随机化顶点的放置,java,graph-theory,jgrapht,jgraph,Java,Graph Theory,Jgrapht,Jgraph,我在jgraph的帮助下创建了一个可视化应用程序。关于这一点,我有几个问题 1:我需要根据顶点对象的属性更改顶点的名称。当我使用默认设置运行应用程序时,顶点的名称打印为Vertex@c8191c(根据顶点进行更改)。我想将此名称更改为顶点的属性值 2:这是最关键的。生成的顶点数不是静态的。数量取决于应用程序的各种其他因素,并且每次运行应用程序时都会发生变化。当我使用默认设置运行这个应用程序时,节点重叠,并且在第一个位置只显示一个。我需要在jgraph中随机分布节点 有人能帮我解决这两个问题吗。如

我在jgraph的帮助下创建了一个可视化应用程序。关于这一点,我有几个问题

1:我需要根据顶点对象的属性更改顶点的名称。当我使用默认设置运行应用程序时,顶点的名称打印为Vertex@c8191c(根据顶点进行更改)。我想将此名称更改为顶点的属性值

2:这是最关键的。生成的顶点数不是静态的。数量取决于应用程序的各种其他因素,并且每次运行应用程序时都会发生变化。当我使用默认设置运行这个应用程序时,节点重叠,并且在第一个位置只显示一个。我需要在jgraph中随机分布节点

有人能帮我解决这两个问题吗。如果您需要更多信息,请提及。下面是我可视化图形的代码

public void randomizeLocations(JGraph jgraph) {
    System.out.println("Visualization 1");
    GraphLayoutCache cache = jgraph.getGraphLayoutCache();
    System.out.println("Visualization 2");
    Random r = new Random();
    for (Object item : jgraph.getRoots()) {
        System.out.println("Visualization 3");
        GraphCell cell = (GraphCell) item;
        CellView view = cache.getMapping(cell, true);
        Rectangle2D bounds = view.getBounds();
        System.out.println("next double"+r.nextDouble()*400);
        bounds.setRect(r.nextDouble() * 400, r.nextDouble() * 5,
                bounds.getWidth(), bounds.getHeight());

    }
    System.out.println("Visualization 4");
    cache.reload();
    System.out.println("Visualization 5");
    jgraph.repaint();
    System.out.println("Visualization 6");

}
先谢谢你

1)覆盖顶点对象的toString方法

@覆盖
公共字符串toString(){
返回“要在此处显示的任何属性”;
}

2) 将顶点放入哈希集中。这将确保仅将唯一顶点添加到列表中。此外,您需要覆盖顶点对象的.equals()和.hashCode()方法,以确保唯一性。(见此处)。继续生成更多顶点,直到哈希集大小等于所需值

HashSet<Point2D.Double> unique = new HashSet<Point2D.Double>();
Random r = new Random();
for (Object item : jgraph.getRoots()) {
    System.out.println("Visualization 3");
    GraphCell cell = (GraphCell) item;
    CellView view = cache.getMapping(cell, true);
    Rectangle2D bounds = view.getBounds();
    int currentSize = unique.size();
    double x;
    double y;
    while (unique.size() == currentSize) {
      x = r.nextDouble() * 400;
      y = r.nextDouble() * 5;
      unique.add(new Point2D.Double(x,y));
    }
    bounds.setRect(x, y, bounds.getWidth(), bounds.getHeight());
}
HashSet unique=new HashSet();
随机r=新随机();
对于(对象项:jgraph.getRoots()){
System.out.println(“可视化3”);
GraphCell单元格=(GraphCell)项;
CellView视图=cache.getMapping(cell,true);
矩形2D边界=view.getBounds();
int currentSize=unique.size();
双x;
双y;
while(unique.size()==currentSize){
x=r.nextDouble()*400;
y=r.nextDouble()*5;
添加(新的Point2D.Double(x,y));
}
setRect(x,y,bounds.getWidth(),bounds.getHeight());
}
1)覆盖顶点对象的toString方法

@覆盖
公共字符串toString(){
返回“要在此处显示的任何属性”;
}

2) 将顶点放入哈希集中。这将确保仅将唯一顶点添加到列表中。此外,您需要覆盖顶点对象的.equals()和.hashCode()方法,以确保唯一性。(见此处)。继续生成更多顶点,直到哈希集大小等于所需值

HashSet<Point2D.Double> unique = new HashSet<Point2D.Double>();
Random r = new Random();
for (Object item : jgraph.getRoots()) {
    System.out.println("Visualization 3");
    GraphCell cell = (GraphCell) item;
    CellView view = cache.getMapping(cell, true);
    Rectangle2D bounds = view.getBounds();
    int currentSize = unique.size();
    double x;
    double y;
    while (unique.size() == currentSize) {
      x = r.nextDouble() * 400;
      y = r.nextDouble() * 5;
      unique.add(new Point2D.Double(x,y));
    }
    bounds.setRect(x, y, bounds.getWidth(), bounds.getHeight());
}
HashSet unique=new HashSet();
随机r=新随机();
对于(对象项:jgraph.getRoots()){
System.out.println(“可视化3”);
GraphCell单元格=(GraphCell)项;
CellView视图=cache.getMapping(cell,true);
矩形2D边界=view.getBounds();
int currentSize=unique.size();
双x;
双y;
while(unique.size()==currentSize){
x=r.nextDouble()*400;
y=r.nextDouble()*5;
添加(新的Point2D.Double(x,y));
}
setRect(x,y,bounds.getWidth(),bounds.getHeight());
}

您好,谢谢您的回复。我解决了第一个问题。对于第二种解决方案仍然没有多少混淆。我很确定应用程序会生成具有唯一属性值的不同对象。这是应用程序的一个特性。此外,它为所有顶点创建单独的节点。只是它们是重叠的。我仍然可以在jframe中拖动它们并将它们分开。我需要的是,我希望节点在创建时是分开的。对不起,我错过了什么。若你们能进一步解释你们的答案…我希望它们在jframe中均匀分布,不管节点的数量如何。我需要关注你们的代码,让我可以通过编程移动这些节点。您可以使用相同的HashSet思想来确定某个节点是否已经存在于某个位置,然后以不同的方式放置它。我在另一个类中创建了这个图。这些代码是无用的。请不要把它放在回答中。只需通过编辑将其放入问题本身。我需要为ListenableDirectedGraphHi类生成
图形
变量/代码的代码,谢谢您的回复。我解决了第一个问题。对于第二种解决方案仍然没有多少混淆。我很确定应用程序会生成具有唯一属性值的不同对象。这是应用程序的一个特性。此外,它为所有顶点创建单独的节点。只是它们是重叠的。我仍然可以在jframe中拖动它们并将它们分开。我需要的是,我希望节点在创建时是分开的。对不起,我错过了什么。若你们能进一步解释你们的答案…我希望它们在jframe中均匀分布,不管节点的数量如何。我需要关注你们的代码,让我可以通过编程移动这些节点。您可以使用相同的HashSet思想来确定某个节点是否已经存在于某个位置,然后以不同的方式放置它。我在另一个类中创建了这个图。这些代码是无用的。请不要把它放在回答中。只需通过编辑将其放入问题本身。我需要为ListenableDirectedGraph类生成
图形
变量/代码的代码