Pergunta

Eu tenho um JTextArea em (múltiplos) JScrollPane em um JTabbedPane.

Eu preciso acessar o JTextArea. Se eu não tinha o JScrollPane, eu poderia fazer:

JTextArea c = (JTextArea)jTabbedPane1.getComponentAt(i);

Como eu poderia obtê-lo quando em um JScrollPane?

Cheers, Gazler.

Foi útil?

Solução

Esta linha parece complexo, mas eu THINK isso iria fazê-lo.

JTextArea c = (JTextArea) (((JViewportView) (((JScrollPane) jTabbedPane1.getComponentAt(i)).getViewport()))).getView();

Mas eu acho que seria mais interessante para armazenar seu TextArea está em um ArrayList.
Então você pode fazer isso:

List<JTextArea> listAreas = new ArrayList<JTextArea>();

...
JTextArea c = listAreas.get(i);

Criar um novo é algo como isto:

JTextArea c = new JTextArea();
jTabbedPane1.addTab("Title", new JScrollPane(c));
listAreas.add(c);

Espero que isso ajude.

Outras dicas

Parece que você vai entrar em uma confusão de referências lá (pelo menos é o que me aconteceu no passado).

Eu sugiro que você tem um objeto meio no comando dessas dependências para você e para mover os métodos de "negócios" lá.

Assim, em vez de adicionar componentes e perder as referências (ou pior, duplicando as referências em todo o lugar), você pode usar esse objeto que terá a referência:

class AppMediator {
     private JTextArea area;
     private JTabbetPane pane;

     // etc. 

     public void doSomethingWithText() {
          this.area.getText(); // etc 
     }
 }

Veja a href="http://en.wikipedia.org/wiki/Mediator_pattern" rel="noreferrer"> padrão de design . O foco é a mover todos os objectos "vista" de onde eles são (geralmente como referências em subclasses) para um objeto intermediário comum.

Eu prefiro a abordagem AppMediator mas você também pode fazer

scrollPane.getViewport().getView()
scroll top