2013-03-27 5 views
0

dans ce code lorsque je veux ajouter un bord entre deux nœuds pour passer ou pour échouer je peux le faire facilement. mais il y a un problème dans la validation et si nous créons à nouveau un bord entre les deux mêmes nœuds que celui créé. C'est ce que je ne veux pas. J'ai besoin d'un seul bord créé entre les deux mêmes nœuds par la classe privée ConnectAction. J'ai essayé quelque chose là mais il ne fonctionne pas. Si nous enlevons l'itérateur et juste créons le bord il est créé.bord unique requis entre deux nœuds d'un graphique

ici est la classe de noeud

private static class Node { 
private Point p; 
private int r; 
private String NAME; 
private String nodeid; 
private boolean selected = false; 
private Rectangle b = new Rectangle(); 

/** 
* Construct a new node. 
*/ 
public Node(String nodeid,Point p, int r,String NAME) { 
    this.nodeid=nodeid; 
    this.p = p; 
    this.r = r; 
    this.NAME = NAME; 

    setBoundary(b); 

} 

/** 
* Calculate this node's rectangular boundary. 
*/ 
private void setBoundary(Rectangle b) { 
    b.setBounds(p.x - r, p.y - r, 2 * r, 2 * r); 
} 

/** 
* Draw this node. 
*/ 
public void draw(Graphics g) { 
    g.setColor(Color.white); 

      g.fillRect(b.x, b.y, b.width, b.height); 
      g.setColor(Color.black); 
      g.drawString(NAME,b.x+25,b.y+40); 

    if (selected) { 
     g.setColor(Color.darkGray); 
     g.drawRect(b.x+3, b.y+3, b.width, b.height); 
    } 
} 

/** 
* Return this node's location. 
*/ 
public Point getLocation() { 
    return p; 
} 

/** 
* Return true if this node contains p. 
*/ 
public boolean contains(Point p) { 
    return b.contains(p); 
} 

/** 
* Return true if this node is selected. 
*/ 
public boolean isSelected() { 

    return (selected); 

} 

/** 
* Mark this node as selected. 
*/ 
public void setSelected(boolean selected) { 
    this.selected = selected; 
} 

/** 
* Collected all the selected nodes in list. 
*/ 
public static void getSelected(List<Node> list, List<Node> selected) { 
    selected.clear(); 
    for (Node n : list) { 
     if (n.isSelected()) { 
      selected.add(n); 
     } 
    } 
} 

/** 
* Select no nodes. 
*/ 
public static void selectNone(List<Node> list) { 
    for (Node n : list) { 
     n.setSelected(false); 
    } 
} 

/** 
* Select a single node; return true if not already selected. 
*/ 
public static boolean selectOne(List<Node> list, Point p) { 
    for (Node n : list) { 
     if (n.contains(p)) { 
      if (!n.isSelected()) { 
       Node.selectNone(list); 
       n.setSelected(true); 
      } 
      return true; 
     } 
    } 
    return false; 
} 

/** 
* Select each node in r. 
*/ 
public static void selectRect(List<Node> list, Rectangle r) { 
    for (Node n : list) { 
     n.setSelected(r.contains(n.p)); 

    } 
} 

/** 
* Toggle selected state of each node containing p. 
*/ 
public static void selectToggle(List<Node> list, Point p) { 
    for (Node n : list) { 
     if (n.contains(p)) { 
      n.setSelected(!n.isSelected()); 
     } 
    } 
} 

/** 
* Update each node's position by d (delta). 
*/ 
public static void updatePosition(List<Node> list, Point d) { 
    for (Node n : list) { 
     if (n.isSelected()) { 
      n.p.x += d.x; 
      n.p.y += d.y; 
      n.setBoundary(n.b); 

     } 
    } 
} 

}

est ici la classe de bord

private static class Edge{ 

private Node n1; 
private Node n2; 
private String Ctype; 
private String eid; 

private static String edgeid; 

public Edge(String eid,Node n1, Node n2, String Ctype) { 
    this.eid = eid; 
    this.n1 = n1; 
    this.n2 = n2; 
    this.Ctype=Ctype; 


} 

public void draw(Graphics g) { 
    Point p1 = n1.getLocation(); 
    Point p2 = n2.getLocation(); 
    g.setColor(Color.darkGray); 
    g.drawLine(p1.x, p1.y, p2.x, p2.y); 
    g.drawString(Ctype,(p1.x+p2.x)/2,(p1.y+p2.y)/2); 
}   

}

et face à problème ici pour créer un seul bord entre même paire des noeuds.

private class ConnectAction extends AbstractAction { 

String ConnectionType;

public ConnectAction(String name) { 
    super(name); 
    this.ConnectionType=name; 
} 

public void actionPerformed(ActionEvent e) { 
    Node.getSelected(nodes, selected); 
    if (selected.size() > 1) { 
     for (int i = 0; i < 1; ++i) { 
      Node n3 = selected.get(i); 
      Node n4 = selected.get(i + 1); 
      String a= n3.nodeid; 
      String b= n4.nodeid; 
      // System.out.println(a); 
      //System.out.println(b); 

      //System.out.println(Edgeid); 


      ListIterator<Edge> iter = edges.listIterator(); 
      while (iter.hasNext()) { 
       Edge e1 = iter.next(); 
       if (!(n3.nodeid == e1.n1.nodeid && n4.nodeid == e1.n2.nodeid) || (n4.nodeid == e1.n1.nodeid && n3.nodeid == e1.n2.nodeid)) { 
        String Edgeid=ID.giveid(); 
        Edge ed=new Edge(Edgeid,n3, n4,ConnectionType); 
        edges.add(ed); 

       }iter.remove(); 

      }                                                                   }                
    }  
    repaint(); 
} 

Répondre

0

Peut-être que j'ai mal compris ce que vous voulez (ou votre code) mais cette

ListIterator<Edge> iter = edges.listIterator(); 
while (iter.hasNext()) { 
    Edge e1 = iter.next(); 
    if (!(n3.nodeid == e1.n1.nodeid && n4.nodeid == e1.n2.nodeid) || (n4.nodeid == e1.n1.nodeid && n3.nodeid == e1.n2.nodeid)) { 
     String Edgeid=ID.giveid(); 
     Edge ed=new Edge(Edgeid,n3, n4,ConnectionType); 
     edges.add(ed); 
    } 
    iter.remove(); 
}    

crée et supprime de nombreux bords. (Et vous avez une erreur dans la condition (l'est uniquement appliquée à la première partie)

Je thinkg vous devriez avoir quelque chose comme ceci:

boolean exists = false; 
ListIterator<Edge> iter = edges.listIterator(); 

while (iter.hasNext()) { 
    Edge e1 = iter.next(); 
    if ((n3.nodeid.equals(e1.n1.nodeid) && n4.nodeid.equals(e1.n2.nodeid)) || (n4.nodeid.equals(e1.n1.nodeid) && n3.nodeid.equals(e1.n2.nodeid))) { 
     exists = true; 

    } 
} 

if (!exists) { 
    String Edgeid=ID.giveid(); 
    Edge ed=new Edge(Edgeid,n3, n4,ConnectionType); 
    edges.add(ed); 
} 

En outre, vous devez généralement utiliser String.equals (Chaîne) pour comparer les chaînes

Questions connexes