[Ajuda] Desenhar grafo em um frame

Bom dia a todos,

estou com dificuldades em desenvolver um trabalho de grafos da faculdade sobre TSP.

O código a seguir implementa a interface do meu programa onde ficará disponível as formas de resolver o problema do caixeiro viajante.
Minha dificuldade está em:

Como desenhar um grafo na área reservada , informando as coordenadas x,y de cada vertice?

Desde já agradeço toda ajuda.


//Interface do algoritmo baseada na implementação de Luciano Zanuz
//Disponível em http://bit.ly/programacaixeiroviajante
//http://www.zanuz.com/2007/09/o-problema-do-caixeiro-viajante.html

package CaixeiroViajante;
import java.util.Date;

import javax.swing.JFileChooser;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

import junit.*;
import org.jgraph.JGraph;
import java.applet.*;
import java.awt.*;

public class Principal extends javax.swing.JFrame {
    

    public Principal() {
        initComponents();
    }
    
//Inicializa Componentes
    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jLabel2 = new javax.swing.JLabel();
        buttonForcabruta = new javax.swing.JButton();
        buttonVizinho = new javax.swing.JButton();
        buttonInsercaoproximo = new javax.swing.JButton();
        buttonInsercaodistante = new javax.swing.JButton();
        buttonSair = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        
        jLabel3 = new javax.swing.JLabel();
        jPanel2 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        JMenuBar Barra = new javax.swing.JMenuBar();
        JMenu Menu = new javax.swing.JMenu();
        JMenuItem Abrir = new javax.swing.JMenuItem();
        JMenuItem Sair = new javax.swing.JMenuItem();
        
        Menu.setText("File");        
        Abrir.setText("Abrir");
        Abrir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                AbrirActionPerformed(evt);
            }
        });
        Menu.add(Abrir);
        
        Sair.setText("Sair");
        Sair.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                SairActionPerformed(evt);
            }
        });
        
        Menu.add(Sair);
        Barra.add(Menu);
        setJMenuBar(Barra);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("TSP - Everton Giani Ribeiro");
        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Parametros"));
        jLabel2.setText("Grafo");

        buttonInsercaodistante.setText("Insercao Mais distante");
        buttonInsercaodistante.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
            	buttonVizinhoActionPerformed(evt);
            }
        });
        
        buttonInsercaoproximo.setText("Insercao Mais Próximo");
        buttonInsercaoproximo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
            	buttonVizinhoActionPerformed(evt);
            }
        });
        
        buttonVizinho.setText("Vizinho Mais Próximo");
        buttonVizinho.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
            	buttonVizinhoActionPerformed(evt);
            }
        });

        buttonForcabruta.setText("Forca Bruta");
        buttonForcabruta.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonForcabrutaActionPerformed(evt);
            }
        });
        
        buttonSair.setText("Sair");
        buttonSair.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonSairActionPerformed(evt);
            }
        });

       
        
        //Imprimir a matriz de adjacencia aqui
       
        //jScrollPane2.setViewportView(jTextArea2);

        jLabel3.setText("");
        
        
        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel2)
                    .addComponent(jLabel3))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(buttonForcabruta)
                        .addGap(10, 10, 10)
                        .addComponent(buttonInsercaoproximo)
                        .addGap(10, 10, 10)
                        .addComponent(buttonInsercaodistante)
                        .addGap(10, 10, 10)
                        .addComponent(buttonVizinho)
                        .addGap(10, 10, 10)
                        .addComponent(buttonSair))
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 370, Short.MAX_VALUE))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel3))
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 276, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(buttonSair)
                    .addComponent(buttonInsercaodistante)
                    .addComponent(buttonInsercaoproximo)
                    .addComponent(buttonVizinho)
                    .addComponent(buttonForcabruta)))
        );

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Resultado "));
        jTextArea1.setColumns(40);
        jTextArea1.setRows(10);
        jScrollPane1.setViewportView(jTextArea1);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 526, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 251, javax.swing.GroupLayout.PREFERRED_SIZE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        pack();
    }
    
    private void SairActionPerformed(java.awt.event.ActionEvent evt) {
        System.exit(0);
    }

    private void AbrirActionPerformed(java.awt.event.ActionEvent evt) {
    
    JFileChooser chooser = new JFileChooser();
    int returnVal = chooser.showOpenDialog(null);
    if(returnVal == JFileChooser.APPROVE_OPTION) {
       String arquivo = (chooser.getSelectedFile().getName());
       //Recebe o nome do arquivo selecionado
       String diretorio = ((chooser.getCurrentDirectory())+"\\"+arquivo);
       //Chama metodo da classe responsavel por leitura do arquivo
       //retorna um vetor de objetos do tipo vertice, cada qual contem um rotulo,coord x e coord y
       vertices = file.read(diretorio);
       //Escreve nome do arquivo na interface
       jLabel3.setText("Instancia : "+arquivo);
       //Define o numero de vertices
       numVertices = vertices.length;
       
       }
 	
    }
    
    
    
    
    

    
    private void buttonInsercaoproximoActionPerformed(java.awt.event.ActionEvent evt) {
        
    	Date horaInicio = new Date();
        long horaInicioLong = horaInicio.getTime();

        //Codigo aqui
        
        
        
        //Mostra o tempo de execução
        Date horaFinal = new Date();
        long horaFinalLong = horaFinal.getTime();
        long tempoExecucaoMili = (horaFinalLong-horaInicioLong);
        Double tempoExecucaoSeg = tempoExecucaoMili/1000.0;

        jTextArea1.append("\n\nInício: " + horaInicio);
        jTextArea1.append("\nFinal: " + horaFinal);
        jTextArea1.append("\nTempo de execução: " + Double.toString(tempoExecucaoSeg) + " segundos (" + tempoExecucaoMili + " milisegundos)");
    	
    }

    private void buttonInsercaodistanteActionPerformed(java.awt.event.ActionEvent evt) {
    
    	Date horaInicio = new Date();
        long horaInicioLong = horaInicio.getTime();

        //Codigo aqui
        
        
        
        //Mostra o tempo de execução
        Date horaFinal = new Date();
        long horaFinalLong = horaFinal.getTime();
        long tempoExecucaoMili = (horaFinalLong-horaInicioLong);
        Double tempoExecucaoSeg = tempoExecucaoMili/1000.0;

        jTextArea1.append("\n\nInício: " + horaInicio);
        jTextArea1.append("\nFinal: " + horaFinal);
        jTextArea1.append("\nTempo de execução: " + Double.toString(tempoExecucaoSeg) + " segundos (" + tempoExecucaoMili + " milisegundos)");
    	
    }
    
    private void buttonVizinhoActionPerformed(java.awt.event.ActionEvent evt) {
        
    	Date horaInicio = new Date();
        long horaInicioLong = horaInicio.getTime();

        //Codigo aqui
        
        
        
        //Mostra o tempo de execução
        Date horaFinal = new Date();
        long horaFinalLong = horaFinal.getTime();
        long tempoExecucaoMili = (horaFinalLong-horaInicioLong);
        Double tempoExecucaoSeg = tempoExecucaoMili/1000.0;

        jTextArea1.append("\n\nInício: " + horaInicio);
        jTextArea1.append("\nFinal: " + horaFinal);
        jTextArea1.append("\nTempo de execução: " + Double.toString(tempoExecucaoSeg) + " segundos (" + tempoExecucaoMili + " milisegundos)");
    	
    }
    
    private void buttonForcabrutaActionPerformed(java.awt.event.ActionEvent evt) {
        int i,j;
        
        Date horaInicio = new Date();
        long horaInicioLong = horaInicio.getTime();

        //Codigo aqui
        
        
        
        //Mostra o tempo de execução
        Date horaFinal = new Date();
        long horaFinalLong = horaFinal.getTime();
        long tempoExecucaoMili = (horaFinalLong-horaInicioLong);
        Double tempoExecucaoSeg = tempoExecucaoMili/1000.0;

        jTextArea1.append("\n\nInício: " + horaInicio);
        jTextArea1.append("\nFinal: " + horaFinal);
        jTextArea1.append("\nTempo de execução: " + Double.toString(tempoExecucaoSeg) + " segundos (" + tempoExecucaoMili + " milisegundos)");
    }
    
    
    
    private void buttonSairActionPerformed(java.awt.event.ActionEvent evt) {
        System.exit(0);
    }
    
 
    //Classe principal
    
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
            	
                new Principal().setVisible(true);
            }
        });
    }
    
    //Variaveis
    private javax.swing.JButton buttonForcabruta;
    private javax.swing.JButton buttonVizinho;
    private javax.swing.JButton buttonInsercaoproximo;
    private javax.swing.JButton buttonInsercaodistante;
    private javax.swing.JButton buttonSair;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea jTextArea1;
    

    Vertice vertices [] = null;	//Vetor com os vertices lidos do arquivo
    int numVertices;            /* número de vértices do grafo */
    int min;                    /* usado para selecionar o menor ciclo */
}

Você pode sobrescrever o método paintComponent de um JFrame ou JPanel, assim pode desenhar o que quiser dentro da tela usando, por exemplo, Java2D.

Veja:
http://download.oracle.com/javase/tutorial/2d/index.html
http://pontov.com.br/site/java/48-java2d

O que não faltam são exemplos pela net afora (e aqui no fórum também).

Abraço.