在这段代码中,当我想在两个节点之间添加传递或失败时,我可以轻松地做到这一点。但验证存在问题,如果我们再次创建它创建的相同两个节点之间的边缘。多数民众赞成我不想要的。我只需要私有类ConnectAction在同一个两个节点之间创建一条边。我在那里尝试了一些东西,但它不起作用。如果我们删除迭代器并只创建它被创建的边缘。请帮助。
这是节点类
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);
}
}
}
}
这是边缘类
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);
}
}
这里面临的问题是在同一对节点之间只创建一条边。
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();
}
答案 0 :(得分:0)
也许我误解了你想要的东西(或你的代码)但是这个
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();
}
创建并删除大量边。 (并且您在条件中有错误(!仅适用于第一部分)
我想你应该有这样的事情:
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);
}
此外,您通常应使用String.equals(String)来比较字符串。