Duvida de como fazer Java2D?

Salve galera.

Eh o seguinte, eu tenho uma classe que extende um JPanel, que seria o q eu vou desenhar usando Java2D - Graphics2D. Tem o nome de JPanelDesktopWork.
O meu JFrame extende esse JPanel que é apenas uma área de trabalho, q como disse é o q ira desenhar.
No meu JFrame eu tenho varios outros JPanels q seriam os panelControle(formas geometricas), panelText(fontes, cores, tamanhos), e o panelColor(cores)…enfim as ferramentas para se trabalhar.
Minha pergunta é, como eu faço por exemplo, para quando clicar no panelControle(no botao line), eu consiga desenhar nesse JPanelDesktopWork.

aqui como estou fazendo.

//aqui o FramePrincipal - JFrame  
public class FramePrincipal extends javax.swing.JFrame {      
    JTabbedPane jTP; //controla JPanelDesktopWork
    ArrayList<JPanelDesktopWork> listDeskWork = new ArrayList<JPanelDesktopWork>();      
  
    /** Creates new form FramePrincipal */  
    public FramePrincipal() {  
        new MetodosDiversos().setLookandFeel();  
        initComponents();  
          
        begin(); //invoca metodo de criacao area trabalho  
    }  
      
    public void begin(){  
        this.setExtendedState(MAXIMIZED_BOTH);  
        this.setLayout(new BorderLayout());  
        this.add(panelNorth, BorderLayout.NORTH);  
        this.jTP = new JTabbedPane();  
        this.getContentPane().add(this.jTP, BorderLayout.CENTER);   
        int location = JTabbedPane.BOTTOM;  
        this.jTP.setTabPlacement(location);         
        this.add(panelSouth, BorderLayout.SOUTH);         
        getFonts();  
        addDeskArea();  
    }  
      
    public void getFonts(){ //pega todas as fontes do sistema operacional e as coloca num JComboBox  
        String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();  
        for(String f : fonts){  
            this.jcomboFonts.addItem(f);  
        }         
    }  
  
    public void addDeskArea(){   
        DesktopArea deskArea = new DesktopArea(this.jTP);   
        JPanelDesktopWork deskWork = new JPanelDesktopWork(this);  
        this.listDeskWork.add(deskWork);  
        this.jTP.add(deskWork);//aqui onde eu add o JPanelDeskWork             
        this.jTP.setTabComponentAt(jTP.getTabCount() -1, deskArea);  
        this.jTP.setSelectedIndex(jTP.getTabCount() -1);          
    }  
  
  
  
//aqui o JPanelDesktopWork - Onde devera se fazer os desenhos, trocar cores, fontes etc...  
public class JPanelDesktopWork extends JPanel implements MouseListener, MouseMotionListener{   
    private FramePrincipal frame;  
          
    public JPanelDesktopWork(FramePrincipal frame){  
        this.setFramePrincipal(frame);          
        this.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));  
        this.addMouseListener(this);       
        this.addMouseMotionListener(this);  
    }  
          
   public void paintComponent(Graphics g){        
      Graphics2D g2d = (Graphics2D)g;  
   }  
     
   public Graphics2D getGraphics(){  
       return this.getGraphics();  
   }  
     
     
   /* mouse coordinate */  
   public String showCoordinates(MouseEvent e){  
       String x = "";  
       String y = "";  
       if(e.getX() < 0){  
           x = "0";  
       }else {  
           x = String.valueOf(e.getX());  
       }  
         
       if(e.getY() < 0 ){  
           y = "0";             
       }else{  
           y = String.valueOf(e.getY());  
       }  
       String coordinate = ("x:" +x + "  y:" + y);               
       return coordinate;   
   }  
     
     
   /* return coordinate */  
  
    @Override  
    public void mouseClicked(MouseEvent e) {  
        //throw new UnsupportedOperationException("Not supported yet.");  
          
          
    }  
  
    @Override  
    public void mousePressed(MouseEvent e) {  
        //throw new UnsupportedOperationException("Not supported yet.");  
          
    }  
  
    @Override  
    public void mouseReleased(MouseEvent e) {  
        throw new UnsupportedOperationException("Not supported yet.");  
    }  
  
    @Override  
    public void mouseEntered(MouseEvent e) {  
        //throw new UnsupportedOperationException("Not supported yet.");  
        showCoordinates(e);  
    }  
  
    @Override  
    public void mouseExited(MouseEvent e) {  
        //throw new UnsupportedOperationException("Not supported yet.");  
        showCoordinates(e);  
    }  
  
    @Override  
    public void mouseDragged(MouseEvent e) {  
        throw new UnsupportedOperationException("Not supported yet.");  
    }  
  
    @Override  
    public void mouseMoved(MouseEvent e) {  
        //throw new UnsupportedOperationException("Not supported yet.");          
        this.frame.setCoordenadas(showCoordinates(e));          
    }      
     
    public void setFramePrincipal(FramePrincipal frame){  
        this.frame = frame;  
    }  
      
    public FramePrincipal getFramePrincipal(){  
        return this.frame;  
    }  
}  

Eu fiz mandando os botoes para o JPanelDesktopWork, funciona…Mas vai ficando muito codigo dentro de apenas uma classe. Acho que o ideal seria criar algo do tipo, se quiser desenhar uma linha, ter uma classe com todos os metodos de linhas, como tipo, cor, coordenadas etc…etc. O mesmo para outras ferramentas, como texto, retangulos etc. Acho q seria a melhor forma, porem ainda naum estou conseguindo fazer. E tbm nao sei como fazer isso para desenhar dentro do JPanelDesktopWork(area de desenho)

veja a tela principal do projeto: http://www.4shared.com/photo/KixYGT9l/projeto.html

a area pintada de preto eh o JPanelDesktopWork q me refiro, onde ira fazer os desenhos geometricos qdo se clica no botao da figura geometrica a q se quer desenhar.

obrigado.

Opa galera…consegui resolver. Uffa, depois de tanto apanhar esta resolvido. kk !

Fiz assim.

// JPanel q vou fazer os desenhos
public class JPanelDesktopWork extends JPanel implements ActionListener, MouseListener, MouseMotionListener{ 
    
    public JPanelDesktopWork(){
        this.setBackground(Color.BLACK);
        this.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
    }

    public void paintComponent(Graphics g){
        Graphics2D g2d = (Graphics2D)g;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mousePressed(MouseEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
}



//aqui o JFrame q vai extende-lo
public class FramePrincipal extends javax.swing.JFrame {    
    JTabbedPane jTP; //aqui um JTabbedPane q controla os Panels de desenho
    ArrayList<JPanelDesktopWork> listDeskWork = new ArrayList<JPanelDesktopWork>(); //aqui add os Panels de desenho dentro de um arraylist

    public FramePrincipal(){
        begin(); 
    }

    public void begin(){
        //inicia o projeto com um novo Panel de desenho ja add.
        this.setExtendedState(MAXIMIZED_BOTH);
        this.setLayout(new BorderLayout());
        this.add(panelNorth, BorderLayout.NORTH);
        this.jTP = new JTabbedPane();
        this.getContentPane().add(this.jTP, BorderLayout.CENTER); 
        int location = JTabbedPane.BOTTOM;
        this.jTP.setTabPlacement(location);       
        this.add(panelSouth, BorderLayout.SOUTH);
        getFonts();
        addDeskArea();
    }

     public void getFonts(){ //pega todas as fontes do SO e add em um JComboBox
        String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
        for(String f : fonts){
            this.jcomboFonts.addItem(f);
        }       
    }

    public void addDeskArea(){ //metodo q adiciona um novo projeto com um Panel de desenho.
        DesktopArea deskArea = new DesktopArea(this.jTP); 
        JPanelDesktopWork deskWork = new JPanelDesktopWork();        
        this.listDeskWork.add(deskWork);
        this.jTP.add(deskWork);           
        this.jTP.setTabComponentAt(jTP.getTabCount() -1, deskArea);
        this.jTP.setSelectedIndex(jTP.getTabCount() -1);
        
        /*Show coordinates -- exibe coordenadas */
        deskWork.addMouseMotionListener(new MouseMotionListener() {
            @Override
            public void mouseDragged(MouseEvent e) {
                throw new UnsupportedOperationException("Not supported yet.");
            }

            @Override
            public void mouseMoved(MouseEvent e) {                
                lblCoordinate.setText("x:" + e.getX() + "  y:" + e.getY()); //jlabel q exibe as coordenadas do panel de desenho
            }
        });
        /*close show coordinates*/        
    }


     private void btnLineDrawActionPerformed(java.awt.event.ActionEvent evt) {
            //aqui o metodo que desenha no Panel desenho q esta selecionado a partir do JTabbedPane do projeto.
            int i = jTP.getSelectedIndex();   
            Graphics2D g2d = (Graphics2D)listDeskWork.get(i).getGraphics();     
            g2d.drawLine(100, 100, 200, 200);
     }
}

Naum sei se eh a melhor forma de se fazer, mas eh a q consegui chegar, esta 100% funcional. …QQuer dica, posta ae !!!

t+ e obrigado