Problemas com atributos e classes aninhadas

3 respostas
E

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
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)
  {
  }
}

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

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)
  {
    
  }
}

***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

3 Respostas

F

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 +

E
eu mantive a classe MouseKeeper como classe interna e retirei a Shape, porém deu o erro: java.lang.StackOverflowError A classe Shape é abstract:
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);
  }
}

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+

F

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

Criado 30 de março de 2005
Ultima resposta 1 de abr. de 2005
Respostas 3
Participantes 2