Problemas com atributos e classes aninhadas

Saudações.
Tenho um exercício em que o livro faz um pequeno Paint usando classes aninhadas e usando atributos da classe externa(main) nas classes internas que operam através de seus métodos eventos de mouse, coordenadas, etc.

Separei as três classes mais críticas e gostaria que me ajudassem a achar uma solução para eu possa fazer o mesmo programa sem aninhamento de classes, usando cada classe em um arq separadamente(pois, mesmo declarando os atributos como public, não funciona).

***classe principal que tem os atributos currentSharpe e image, que seriam acessados pelas classes internas

[code]
public class Paint extends Frame
{
private Button button1 = new Button();
private Button button2 = new Button();
private Button button3 = new Button();
private Image image = null;
private Shape currentShape = null;

public Paint()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}

private void jbInit() throws Exception
{
this.setLayout(null);
this.setSize(new Dimension(400, 300));
this.setTitle("My Paint");
this.setBackground(SystemColor.control);
setTitle("My Paint");
button1.setLabel("Line");
button1.setBounds(new Rectangle(0, 0, 105, 25));
button2.setLabel("Rectangle");
button2.setBounds(new Rectangle(105, 0, 105, 25));
button3.setLabel("Oval");

button3.setBounds(new Rectangle(210, 0, 105, 25));
this.add(button3, null);
this.add(button2, null);
this.add(button1, null); 
Paint p = new Paint();
MouseKeeper k = new MouseKeeper();
addMouseListener(k);
addMouseMotionListener(k);    

}

public void paint(Graphics g)
{
if (image == null)
image = createImage(550, 350);
if(image != null)
g.drawImage(image, 0, 0, this);
}

public static void main(String []args)
{
Frame myFrame = new Paint();
myFrame.show();
}

private void button2_actionPerformed(ActionEvent e)
{
}
}[/code]

***Classe que trata os eventos de mouse e acessa o atributo currenteShape e image da classe principal

[code]public class MouseKeeper extends MouseAdapter implements MouseMotionListener
{
private int startX, startY;
private int lastX, lastY;

public void mousePressed(MouseEvent e)
{
lastX = startX = e.getX();
lastY = startY = e.getX();
}
public void drawShape(Graphics g)
{
if(currentShape != null)
currentShape.draw(g, startX, startY, lastX, lastY);
}
public void mouseDragged(MouseEvent e)
{
Graphics g = image.getGraphics();
g.setXORMode(Color.white);
drawShape(g);
lastX = e.getX();
lastY = e.getY();
drawShape(g);
repaint();
}
public void mouseReleased(MouseEvent e)
{
Graphics g = image.getGraphics();
g.setXORMode(Color.white);
drawShape(g);
g.setPaintMode();
lastX = e.getX();
lastY = e.getY();
drawShape(g);
repaint();
}
public void mouseMoved(MouseEvent e)
{

}
}[/code]

***Classe shape que tb acessa o atributo currentShape da classe principal

public abstract class Shape  extends Button implements ActionListener
{
  public Shape(String name)
  {
    super(name);
    addActionListener(this);
  }
  public abstract void draw(Graphics g, int a, int b, int c, int d);
  
  public void actionPerformed(ActionEvent e)
  {
    currentShape = this;
  }
}

Agradeço
Eliselbert

cara, dadas as classes acimas, só vejo um problema, a referencia chamada currentShape não será enchegada nas outras classes qdo vc as separar, basta dá um jeito de passar essa referencia para Shape e MouseKeeper , acho q é só isso! :oops: será? tenta ai e posta o erro aqui caso tenha +

eu mantive a classe MouseKeeper como classe interna e retirei a Shape, porém deu o erro:
java.lang.StackOverflowError
A classe Shape é abstract:

[code]public abstract class Shape extends Button implements ActionListener
{
private Paint paint;
public Shape(String name)
{
super(name);
addActionListener(this);
}

public abstract void draw(Graphics g, int a, int b, int c, int d);

public void actionPerformed(ActionEvent e)
{
paint.setCurShape(this);
}
}[/code]

Será que o erro tá em declarar uma var do Tipo Paint dentro da Shape?
Não retirei a MouseKeeper da Paint pois os problemas aumentam, então decidi tentar resolver a partir daqui.

Aguardo
T+

esse é um estouro de pilha, tipo como se um metodo tivesse chamado ele mesmo tantas vezes q estourou o heap na memoria