Desenhar linhas no grafo em um JPAnel

Oi Pessoal

O meu trabalho é encontrar a o melhor caminho, onde o usuário cadastra as Filiais e as Rotas entre essas Filiais, esta parte esta ok, consegui gerar
o melhor caminho, agora eu queria desenhar o grafo, ou seja, as aresta com os seus determinado nós, mas não consegui fazer isso, a minha primeira tentativa foi a seguinte:

Criei uma JDialog, e dentro dela adicionei um JPanel.
Neste JPanel eu coloquei os nós e guardei as posições deles.
Depois fui criar as arestas, utilizando método paint, segue o código:

public class TelaMelhorRota extends javax.swing.JDialog {
    
    Filial[] filiais = null;
    List<Filial> melhorRota = null;
    int n=0;
    int x=5, y=10;
    JLabel label;
    
    private JScrollPane jScrollPane;
    Container c = getContentPane();
    
    int rand=0;
    
    /** Creates new form TelaMelhorRota1 */
    public TelaMelhorRota(java.awt.Frame parent, boolean modal, List<Filial> melhorRota) {
        super(parent, modal);
        initComponents();
        
        this.melhorRota = melhorRota;
        //Image im1 = new ImageIcon(getClass().getResource("home.jpg")).getImage();
        ImageIcon img = new ImageIcon((getClass().getResource("home.jpg")));
        filiais = new Filial[melhorRota.size()];
        int i=50, w=15, v=30;
        for(Filial f: melhorRota){
            adicionaFiliais(f);

        }
        
    }
    
    /* Metodo que verifica se uma determinada Filial já
     * esta no JPanel
     */
    public boolean verificaFilial(Filial f){
        boolean achou = false;
        for(int i=0;i<=filiais.length-1;i++){
            if((filiais[i]!=null)){
                if(filiais[i].getNomeFilial().equals(f.getNomeFilial())){
                    achou = true;
                }
            }
        }
        
        return achou;
    }


    /* Metodo que adiciona uma Filial, guarda a sua posição
     * para depois criar as retas
     */    
    public void adicionaFiliais(Filial f){
        
        if(!verificaFilial(f)){
            filiais[n] = f;
            JLabel jNomeFilial = new JLabel();
            jNomeFilial.setText(f.getNomeFilial());
            
            jNomeFilial.setBounds(x, y, 50, 50);
            filiais[n].setX(x);
            filiais[n].setY(y);
            x = x + 20;
            y = y + 40;
            //panelRota.add(jNomeFilial);
            jNomeFilial.setVisible(true);
            n++;
        }
    }
    
    
    //aqui sao desenhadas as retas
    public void paint(Graphics g){
        super.paint(g);
        for(Filial f:melhorRota){
            if(f.getAnterior()!=null){
                for(int i=0;i<=filiais.length-1;i++){
                    if(filiais[i]!=null){
                        if(filiais[i].getNomeFilial().equals(f.getAnterior().getNomeFilial())){

                            g.drawLine(f.getX(), f.getY(), filiais[i].getX(), filiais[i].getY());
                            
                        }
                    }
                }
            }
        }
    }
    

     
     //Netbeans
    /** This method is called from within the constructor to
     * initialize the form.
     *
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
    private void initComponents() {
        jButton1 = new javax.swing.JButton();

        getContentPane().setLayout(null);

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Melhor Rota Encontrada");
        jButton1.setText("Gerar relatorio PDF");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        getContentPane().add(jButton1);
        jButton1.setBounds(540, 580, 200, 23);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-781)/2, (screenSize.height-664)/2, 781, 664);
    }// </editor-fold>                        
    
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        Relatorio relatorio = new Relatorio();
        relatorio.geraRelatorio(melhorRota);
    }                                        
    
    
    
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    // End of variables declaration                   
    
}

O problema é que só é desnehada uma linha e na JDialog, não na JPAnel, alguém pode me ajudar por favor???

Origada :-o

Voce redefiniu o método paint() do JDialog, e não do JPanel onde os dados devem ser desenhados. Passe sua lógica de desenho para o método paintComponent() do JPanel e deve funcionar.

Desenhar na mão é complicado. Mas dá uma olhada nessa lib aqui:
http://www.prefuse.org/