Я разрабатываю Java-программу для Netbeans, чтобы нарисовать дерево графиков, создав его узлы и ребра и превратив его в JPanel.
У меня проблемы только с перетаскиванием узлов и ребер, потому что изображение не обновляется - оно внезапно исчезает, и мне нужно добавить узел или ребро, чтобы снова посмотреть дерево.
Я обнаружил, что ошибка должна быть в функции Graph.paint () или в функциях repaint, revalidate ....
Я искал здесь решение, но не смог найти ничего, что действительно решило бы его.
GraphPanel - это JPanel, который управляет графиком.
График - это структура, в которой хранятся все узлы и ребра
Узел и Край - это структура узлов и ребер соответственно.
Мой GraphPanelMouseClicked код:
Я публикую этот код, чтобы показать, как я рисую узлы и т. Д. [Это работает правильно]
private void GraphPanelMouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
System.out.println("Click X: " + evt.getX() + " , y: " + evt.getY());
System.out.println("Click On Screen X: " + evt.getXOnScreen() + " , y: " + evt.getYOnScreen());
switch(this.ButtonSelection){
case OriHelperGUI.Select:
break;
case OriHelperGUI.AddNode:
String name = JOptionPane.showInputDialog("Node name: ");
String weight = JOptionPane.showInputDialog("Node weight: ");
Node n = new Node(new Point(evt.getX(), evt.getY()), Integer.parseInt(weight), name);
g.addNode(n);
System.out.println("Nodo " + name + " añadido");
break;
case OriHelperGUI.AddEdge:
for(Node node: g.getNodes()){
if(new Rectangle((int)(node.getPoint().getX() - node.getWeight()/2),(int)(node.getPoint().getY() - node.getWeight()/2), (int)node.getWeight(), (int)node.getWeight()).contains(new Point(evt.getX(), evt.getY()))){
if(this.AddEdgeN1==null){
AddEdgeN1 = node;
System.out.println(node.getName());
}
else{
if(AddEdgeN2==null){
AddEdgeN2 = node;
System.out.println("Uniendo " + AddEdgeN1.getName() + " a " + AddEdgeN2.getName());
g.addEdge(new Edge(AddEdgeN1, AddEdgeN2));
AddEdgeN1.addNeighbour(AddEdgeN2);
AddEdgeN2.addNeighbour(AddEdgeN1);
g.checkEdges();
AddEdgeN1 = null;
AddEdgeN2 = null;
}
}
}
}
break;
default:
break;
}
g.paint(GraphPanel.getGraphics());
GraphPanel.revalidate();
}
My GraphPanelMouseDragged код:
Я думаю, что здесь это терпит неудачу ...
private void GraphPanelMouseDragged(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
if(this.SelectedNode>=0){
Node old = this.g.getNodes().get(this.SelectedNode);
Node n = new Node(new Point(evt.getX(),evt.getY()),old.getWeight(),old.getName());
g.getNodes().set(this.SelectedNode, n);
g.paint(GraphPanel.getGraphics());
GraphPanel.revalidate();
}
}
Мой График Методы рисования (g) и paintComponent (g) [Не уверен, какой из них будет работать при обновлении изображения]:
@Override
public void paint(Graphics g){
g.setColor(Color.black);
super.paint(g);
for(Node n:nodes){
n.paintNode(g);
}
for(Edge e:edges){
e.paintEdge(g);
}
}
public void paintComponent(Graphics g){
g.setColor(Color.black);
super.paint(g);
for(Node n:nodes){
n.paintNode(g);
}
for(Edge e:edges){
e.paintEdge(g);
}
}
Узел метод краски (г):
public void paintNode(Graphics g) {
super.paint(g); // don't forget to call the super's method
g.drawOval((int)(point.x -(weight/2)), (int)(point.y-(weight/2)), (int)weight, (int)weight);
g.drawString(name, point.x, point.y);
}
@Override
public void paintComponent(Graphics g) {
super.paint(g); // don't forget to call the super's method
g.drawOval((int)(point.x -(weight/2)), (int)(point.y-(weight/2)), (int)weight, (int)weight);
g.drawString(name, point.x, point.y);
repaint();
}
Наконец, мой Edge метод краски (г):
public void paintEdge(Graphics g) {
super.paint(g); // don't forget to call the super's method
g.drawLine((int)n1.getPoint().getX(), (int)n1.getPoint().getY(), (int)n2.getPoint().getX(), (int)n2.getPoint().getY());
}
@Override
public void paintComponent(Graphics g) {
super.paint(g); // don't forget to call the super's method
g.drawLine((int)n1.getPoint().getX(), (int)n1.getPoint().getY(), (int)n2.getPoint().getX(), (int)n2.getPoint().getY());
repaint();
}
Я также добавляю GIF текущей программы, чтобы лучше понять мою проблему.
Большое вам спасибо