Нарисовать объект динамически при перетаскивании мыши - PullRequest
1 голос
/ 05 марта 2019

Я разрабатываю 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 текущей программы, чтобы лучше понять мою проблему.

Большое вам спасибо

...