Alterando valor de variáveis dentro de Classes Internas!

Olá Pessoal…

Como faço pra uma classe interna acessar uma variável que está na classe principal?

[code]frame.addFocusListener(
new FocusListener() {

				public void focusGained( FocusEvent f )
				{
					internalFrame.contador = 1;
	}
				
				public void focusLost( FocusEvent f )
				{
					
				}
			}
		);[/code]

internalFrame é o nome da classe principal e ela possui uma variável public do tipo int chamada contador.

Recebo o seguinte erro:

Cannot refer to a non-final variable mapa inside an inner class defined in a different method

O que devo fazer?

se a variável estiver na mesma classe faça o seguinte

this.contador = 1;

se estiver em classes diferentes, crie um método

public void setInternalFrame( int pInternalFrame ) {
  internalFrame = pInternalFrame;
}

na classe principal e chame esse método na outra…

caso você esteja extendendo (extends) a classe principal (pai), no filho você deve colocar

super.internalFrame = 1;

deu para ajudar?

Hmmm… com certeza ajudou, mas agora surgiu outro problema…

Vou tentar especificar mais ou menos a idéia do que estou desenvolvendo pra que as vezes alguém conheça outra possibilidade.

Tenho um menu com algumas funções que serão aplicadas em janelas (JInternalFrames) que vão sendo lançadas pelo usuário.

Porém, a função escolhida deve atuar somente na Internal Frame que estiver em Foco.

Ou seja, eu criei uma variável chamada: janelaFocus; adicionei todos os internal frames gerados em um List (java.util.List);

e adicionei um FocusListener em cada internal frame.

Supomos que 5 internal frames estejam abertos. Quando o usuário mudar o foco para a 3ª janela, por exemplo, o Focus Listener

deveria acessar a variável janelaFocus e armazenar o seu valor gerado na List. No caso, 2… (0, 1, --> 2 <-- ). Daí, quando

o mesmo clicar no menu e escolher a ação, o ActionListener pega o valor de janelaFocus e faz o seguinte:

panelImagem panelFocus = (panelImagem)paineis.get( getJanelaFocus() );
panelFocus.camadas( false );

Cria uma variável panelFocus, converte em panelImagem (que é o JPanel exibido dentro de cada internal frame) o paineis.get,

que é o array List de todas as internal frames geradas, e nos parênteses: (o valor da janela em foco - janelaFocus)…

Quando eu troco o getJanelaFocus() pelo inteiro 2, por exemplo, ele funciona perfeitamente. Aplica a função na terceira

janela gerada pelo usuário. Mas como esse valor tem de relacionar-se com a janela em foco, estou tendo dificuldades pra

pensar em como fazer isso.

Segue o trecho do código onde ele tenta armazenar o valor janelaFocus:

[code]panelImagem mapa = new panelImagem();

paineis.add( mapa );

frame.addFocusListener( new FocusListener() {
public void focusGained( FocusEvent f )
{
setJanelaFocus( paineis.indexOf( mapa ) );
}
public void focusLost( FocusEvent f )
{
}
}
);[/code]

Estou usando o Eclipse e ele sublinha a variável mapa dentro de indexOf( mapa ) com o seguinte erro:

Cannot refer to a non-final variable mapa inside an inner class defined in a different method

Alguém sabe como resolver ou me recomenda outra maneira de armazenar alguma característica da janela em Foco pra que eu aplique funções à mesma nos menus?

Abraços… e, será que alguém me entendeu? auhahua

porque você não define um jInternalFrame que recebe a janela que está com o foco?

tipo, na janela filha, você coloca um método

private void formFocusGained(java.awt.event.FocusEvent evt) {
  //Cara, não consegui pensar em um nome melhor  :wink: 
  janelaPai.setJanelaFocus( this );
}

na janela pai você faz o seguinte:

public void setJanelaFocus( jInternalFrame pInternalFrame ) {
 jInternalFrame = pInternalFrame;
}

mas para isso você deve passar a janela pai como referência para a filha…

não é o melhor modo, mas é o mais fácil, entendeu?

Hmm cara, nao entendi… :oops:

vou fazer um exemplo e te passo, espera um pouco pois estou no serviço :smiley:

Blz cara… brigadão…

[code]
//Janela Pai

public class PrincipalVisao extends javax.swing.JFrame {

...

private JInternalFrame iAcao = new JInternalFrame( "", false, true, false, false );

... //Cria algumas variáveis

/** Creates new form Principal */
public PrincipalVisao() {
    initComponents();
    desabilita();
    this.setSize( 800, 600 );
    abreJanela( iLogin, new LoginVisao( this ), "Login", 250, 160 );
}

...

private void mnuAcaoActionPerformed(java.awt.event.ActionEvent evt) {                                        
    abreJanela( iAcao, new AcoesVisao( this ), "Consulta de Ações", 500, 280 );
}                                       

.... // Faz outras coisas

}

// Assim você abre a janela e ainda passa a referência á janela pai
// Vou colocar abaixo a janela filha

public class AcoesVisao extends javax.swing.JPanel {
PrincipalVisao pV;

...

public AcoesVisao( PrincipalVisao pV ) {
    initComponents();
    this.pV = pV;
    preencheGrid();
}

...

private void btnFecharActionPerformed(java.awt.event.ActionEvent evt) {                                          
    pV.fechaAcao();
}                                         

...

}[/code]

ficou meio confuso, qualquer dúvida me fala :wink:

Vlw cara… vou testar depois… brigadão!