Padrão Decorator

Olá!

Estou implementando um decorator. Uma tela que pode ter complementos adicionados dinamicamente. O ScrollBar é um deles, mas ele não está aparecendo.

import javax.swing.JFrame;
import javax.swing.JTextArea;

public interface Tela {
	
	public JFrame getJf_tela();
	public JTextArea getJta_area();
}
import javax.swing.JFrame;
import javax.swing.JTextArea;

public class TelaSimples implements Tela{
	
	private JFrame jf_tela;
	private JTextArea jta_area;
	
	public TelaSimples(){
	}
	
	public JFrame getJf_tela() 
	{		
		jf_tela = new JFrame();
		jf_tela.setSize(200, 200);
		jf_tela.setVisible(true);
		jf_tela.setLocationRelativeTo(null);
		jf_tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		jf_tela.add(getJta_area());
		
		return jf_tela;
	}

	public JTextArea getJta_area() 
	{
		jta_area = new JTextArea(5, 10);
		
		return jta_area;
	}
}
import javax.swing.JFrame;
import javax.swing.JTextArea;

public abstract class TelaDecorator implements Tela{
	
	Tela tela;
	
	public TelaDecorator(Tela tela)
	{
		this.tela = tela;
	}
	
	public JFrame getJf_tela()
	{
		return tela.getJf_tela();
	}
	
	public JTextArea getJta_area()
	{
		return tela.getJta_area();
	}
}
import javax.swing.JScrollPane;

public class TelaComScroll extends TelaDecorator {
	
	public Tela tela;	
	public JScrollPane rolagem;
	
	public TelaComScroll(Tela tela)
	{
		super(tela);
		this.tela = tela;
		
		rolagem = new JScrollPane();
		getJta_area().add(rolagem);
		
		this.tela.getJf_tela();
	}
}
public class TelaMain {

	public static void main(String []args)
	{
		Tela tela = new TelaSimples();
		new TelaComScroll(tela);
	}
}

Alguém poderia me ajudar, dizendo o que está errado?

Uma coisa que percebi é que no método getJta_area() da sua classe TelaSimples, toda vez que
você chama esse método você cria um novo JTextArea.

Então, quando você estiver no construtor da classe TelaComScroll, e chamar:

getJta_area().add(rolagem);

Ele vai criar um novo JTextArea e adicionar um scroll.

Mas logo embaixo, você executa: this.tela.getJf_tela();
E dentro deste método, possui uma linha que chama novamente o getJTa_area():

 jf_tela.add(getJta_area());  

Ou seja, ele vai criar OUTRO JTextArea e substituir por aquele que você colocou o scrollbar.
Não sei se fui muito claro na explicação.

Obs: Outra coisa: eu sugiro você refatorar um pouco o código, está bem confuso.
Exemplo: Na classe TelaComScroll:

public class TelaComScroll extends TelaDecorator {  
      
    public Tela tela;     
    public JScrollPane rolagem;  
      
    public TelaComScroll(Tela tela)  
    {  
        super(tela);                    // está passando tela p/ construtor de TelaDecorator, e é atribuida em uma variavel.
        this.tela = tela;               // aqui tela é armazenado novamente.
          
        rolagem = new JScrollPane();  
        getJta_area().add(rolagem);  
          
        this.tela.getJf_tela();  
    }  
} 

Se TelaDecorator já tem uma variavel Tela, pq ter uma em TelaComScroll ?
flws…

[quote=GuilhermeKFreitas]Uma coisa que percebi é que no método getJta_area() da sua classe TelaSimples, toda vez que
você chama esse método você cria um novo JTextArea.

Então, quando você estiver no construtor da classe TelaComScroll, e chamar:

getJta_area().add(rolagem);

Ele vai criar um novo JTextArea e adicionar um scroll.

Mas logo embaixo, você executa: this.tela.getJf_tela();
E dentro deste método, possui uma linha que chama novamente o getJTa_area():

 jf_tela.add(getJta_area());  

Ou seja, ele vai criar OUTRO JTextArea e substituir por aquele que você colocou o scrollbar.
Não sei se fui muito claro na explicação.

Obs: Outra coisa: eu sugiro você refatorar um pouco o código, está bem confuso.
Exemplo: Na classe TelaComScroll:

public class TelaComScroll extends TelaDecorator {  
      
    public Tela tela;     
    public JScrollPane rolagem;  
      
    public TelaComScroll(Tela tela)  
    {  
        super(tela);                    // está passando tela p/ construtor de TelaDecorator, e é atribuida em uma variavel.
        this.tela = tela;               // aqui tela é armazenado novamente.
          
        rolagem = new JScrollPane();  
        getJta_area().add(rolagem);  
          
        this.tela.getJf_tela();  
    }  
} 

Se TelaDecorator já tem uma variavel Tela, pq ter uma em TelaComScroll ?
flws…
[/quote]

E ae, Guilherme…

Eu reformatei o código, mas mesmo assim, o scroll não aparece…

package com.wilson.padrao.decorator;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public interface Tela {
	
	public JFrame getJf_tela();
	public JTextArea getJta_area();
}
package com.wilson.padrao.decorator;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class TelaSimples implements Tela{
	
	private JFrame jf_tela;
	private JTextArea jta_area;
	
	public TelaSimples()
	{
		jf_tela = new JFrame();
		jta_area = new JTextArea(50, 1000);
	}
	
	public JFrame getJf_tela() 
	{		
		jf_tela.add(getJta_area());
		
		jf_tela.setSize(200, 200);
		jf_tela.setVisible(true);
		jf_tela.setLocationRelativeTo(null);
		jf_tela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
		
		return jf_tela;
	}

	public JTextArea getJta_area() 
	{		
		return jta_area;
	}
}
package com.wilson.padrao.decorator;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public abstract class TelaDecorator implements Tela{
	
	Tela tela;
	
	public TelaDecorator(Tela tela)
	{
		this.tela = tela;
	}
	
	public JFrame getJf_tela()
	{
		return tela.getJf_tela();
	}
	
	public JTextArea getJta_area()
	{
		return tela.getJta_area();
	}
}
package com.wilson.padrao.decorator;

import javax.swing.JScrollPane;

public class TelaComScroll extends TelaDecorator {
	
	public JScrollPane rolagem;
	
	public TelaComScroll(Tela tela)
	{
		super(tela);
		
		rolagem = new JScrollPane();
		getJta_area().add(rolagem);
		
		getJf_tela();
	}
}

Você vê algo a mais de errado?

Alguém me ajuda?