Algo como ponteiro em java?

21 respostas
VictorMatuk

Não sei nem como pesquisar por isso então resolvi pedir uma ajuda.

Veja o código abaixo.

String tempPB = "";
JTextField medPB = new JTextField();

ativaCampo(medPB, tempPB);

//funcao que deixa o campo JtextField ser editado
public void ativaCampo(JTextField campo, String texto) {
	campo.setEditable(true);
	campo.setText(texto);
}

//Estou enviando o JTextField para ser desativado e estou enviando o conteudo de tempPB

desativaCampo(medPB, tempPB);


//AGORA vem o problema!!!!!!!!
//Funcao que desativa um JTextField e guarda o valor dele numa variavel temporaria (tempPB)

public void desativaCampo(JTextField campo, /*Aqui eu receberia o conteudo do medPB, mas eu quero algo como ponteiro para ele*/) {
	campo.setEditable(false); //desativei o JTextField
	var = campo.getText(); //COMO FAÇO PARA ARMAZENAR O TEXTO DO CAMPO JTextField NA VARIAVEL ENVIADA PELO METODO DA LINHA 14?
	campo.setText(""); //Fingi que apaguei o texto do JTextField, mas ele estaria guardado na variavel enviada pelo metodo da linha 14

}

como eu envio uma variavel pra um metodo e faço esse metodo modificar essa variavel?

21 Respostas

E

Java não tem passagem de parâmetros por referência (aquilo que é conhecido no C# como “ref”). Ponto.

VictorMatuk

Nem um método de fazer isso?
Talvez recebendo algo tipo Object var? Sei lá

ViniGodoy

No java só existe passagem por valor.
Porém, toda variável que aponta para um objeto é, na verdade, uma referência. E, quando você passa ela de uma função para outra, você está fazendo apenas a cópia do valor da referência. Ambas as cópias apontam para o mesmo objeto.

Portanto, os seus métodos, do jeito que você mesmo descreveu, funcionam.

jyoshiriro

Amigo, nesse acreito que basta substituir String por StringBuffer. Assim você pode alterar o conteúdo da “String” dentro do objeto sem fazer que com ele ganhe outra referência.

VictorMatuk

Amigo, nesse acreito que basta substituir String por StringBuffer. Assim você pode alterar o conteúdo da “String” dentro do objeto sem fazer que com ele ganhe outra referência.

Opa vou testar.

ViniGodoy

O estranho é que o Java não tem, mas não faz falta.

Provavelmente existe uma maneira diferente e melhor de fazer o que você quer fazer, sem recorrer a referências.

VictorMatuk

Amigo, nesse acreito que basta substituir String por StringBuffer. Assim você pode alterar o conteúdo da “String” dentro do objeto sem fazer que com ele ganhe outra referência.

Opa vou testar.

Funcionou.
Fiz da sequinte maneira. (Este é o código só por alto)

private JTextField medCor;
private StringBuffer medTeste = new StringBuffer();

desativaCampo(medCor, medTeste); //enviei o JTextField e o StringBuffer

public void desativaCampo(JTextField campo, StringBuffer texto) { //recebi né =p
	campo.setEditable(false); //desativei o JTextField
	texto.append(campo.getText()); //Dei append no StringBuffer pra guardar esse valor pois quando desativo o JTextField e o ativo depois, ele vem com o conteudo apagado. Fiz isso pra caso o cliente ative esse JTextField de novo, ele volte com os valores digitados anteriormente
	campo.setText(""); //Fingi que apaguei o texto
}
VictorMatuk

ViniGodoy:
O estranho é que o Java não tem, mas não faz falta.

Provavelmente existe uma maneira diferente e melhor de fazer o que você quer fazer, sem recorrer a referências.

Se tiver algo escrito num JTextField e eu vo lá e faço um JTextField.setEditable(false). Eu faço esse JTextField perder seu conteudo (Pois quero enviar tudo da JFrame num SQL e se tiver o conteudo lá com o JTextField desativado, ele envia assim msm, entao eu tenho que apagar) e se eu quiser ativar esse JTextField por algum motivo num futuro eu vou precisar digitar de novo.
Entao fiz um metodo que guardasse o valor do JTextField numa variavel Temporaria quando o mesmo fosse desativado. E caso ele voltasse a ser ativado, o JTextField dava JTextField.setText(variavelTemporaria)

Preciso desse metodo pois sao mtos JTextFields!

E

No seu caso em particular, seria melhor retornar o valor desejado:

/** 
  * Desativa o campo, limpando-o e retornando o seu conteúdo anterior.
  * @param campo O JTextField, JTextArea etc. que quero desativar
  * @return O valor que estava nesse campo. 
  */
 public String desativaCampo(JTextComponent campo) { 
     campo.setEditable(false); 
     String oldValue = campo.getText();

     campo.setText(""); // limpar o texto (use o retorno deste método caso queira usar valor antigo.)
     return oldValue;
 }
ViniGodoy

Sim, mas isso que você descreveu funciona. E sem referências.

E

O jeito “extreme go-horse” (ou “XGH”) para fazer isso é usar um array de 1 elemento. No seu caso:

public void desativaCampo(JTextComponent campo, String[] valorAntigo) {
     .... valorAntigo[0] = campo.getText();
     ....
}

Obviamente para você criar o tal array de 1 elemento para poder pegar a string antiga é um PITA .

VictorMatuk

Eu testei assim e não foi, por isso pedi ajuda

public void desativaCampo(JTextField campo, String medPB) { campo.setEditable(false); medPB = campo.getText(); campo.setText(""); }

Quando eu envio o medPB “GLOBAL” pro metodo desativaCampo, que tem um medPB tambem, ele grava no medPB do metodo o valor do medPB “GLOBAL” só que eu quero fazer o metodo medPB “GLOBAL” ser modificado e nao o medPB do metodo.

Eu poderia fazer assim

JTextField bla.setEditable(false); medPB = bla.getText(); bla.setText("");

Só que eu vou trabalhar com muitas JTextFields e muitas variaveis temp, entao precisei de um metodo.

VictorMatuk

entanglement:
O jeito “extreme go-horse” (ou “XGH”) para fazer isso é usar um array de 1 elemento. No seu caso:

public void desativaCampo(JTextComponent campo, String[] valorAntigo) {
     .... valorAntigo[0] = campo.getText();
     ....
}

Obviamente para você criar o tal array de 1 elemento para poder pegar a string antiga é um PITA .

Só que esse valorAntigo só vai existir dentro desse metodo. e eu preciso que ele exista de uma maneira “GLOBAL” na classe. pois tenho um jtextfield que nao pode entrar no metodo pra recuperar esse valor =p;

E

Até aí você passa como parâmetro para o método uma variável de instância da classe, oras!

VictorMatuk

E pra finalizar isso tudo eu precisei pois eu queria fazer um JCheckBox que ao ser marcado, desativasse e apagasse o valor de umas JTextFields de acordo com o retorno de uma pesquisa feita na DB.

Entao se o cara resolve desmarcar o JCheckBox, esses JTextFields tem que voltar ao valor antigo (O de antes de ter o JCheckBox marcado).

VictorMatuk
entanglement:
No seu caso em particular, seria melhor retornar o valor desejado:
/** 
  * Desativa o campo, limpando-o e retornando o seu conteúdo anterior.
  * @param campo O JTextField, JTextArea etc. que quero desativar
  * @return O valor que estava nesse campo. 
  */
 public String desativaCampo(JTextComponent campo) { 
     campo.setEditable(false); 
     String oldValue = campo.getText();

     campo.setText(""); // limpar o texto (use o retorno deste método caso queira usar valor antigo.)
     return oldValue;
 }

deu Bug no meu metodo usando apend pois se eu marcar e desmarcar a checkbox fik dando apend e buga entao resolvi usando esse metodo de retorno seu =P

Segue como ficou

private JTextField medPB;
private String tempPB;

private JTextField medCor;
private String tempCor;

tempPB = desativaCampo(medPB, tempPB);
tempCor = desativaCampo(medCor, tempCor);

public String desativaCampo(JTextField campo, String texto) {
	campo.setEditable(false);
	texto = campo.getText();
	campo.setText("");
	return texto;
}
E

Ei, amigo, não precisa passar a string “texto” como parâmetro. Você viu que imediatamente ela é destruída e substituída pelo valor do textbox (linha 12 da sua listagem)?

jyoshiriro

Se for para usar retorno de método, nem precisaria passar a variável como parametro:

Não ficaria melhor assim?

tempCor = desativaCampo(medCor);  
  
public String desativaCampo(JTextField campo) {  
    campo.setEditable(false);  
    String texto = campo.getText();  
    campo.setText("");  
    return texto;  
}
dev.rafael

Desculpa mas, qual era o problema com o:

public String destivaCampo(JTextComponent campo) {
...
...
}
E

Provavelmente ele não gostou do Javadoc. Deve ser alguma norma na empresa dele que você não pode documentar seus métodos :frowning:

VictorMatuk

eh verdade, nao posso documentar.
Nossa empresa sabe que alguns de nós futucam esse fórum. Se me pegam liberando código completo aqui eu morro.

Mas é verdade, obrigado por me mostrar que eu nao precisava passar a String como parametro. Depois de 8 horas direto programando sem descanço costuma ocorrer essas falhas hhehehehe

Criado 19 de agosto de 2010
Ultima resposta 19 de ago. de 2010
Respostas 21
Participantes 5