Receber parametros pelo main e setar labels (RESOLVIDO)

Bom dia,

Estou enviando dois parâmetros quando executo minha aplicação:
java -jar Programa.jar parametro1 parametro2

Recebo eles pelo método main:
parametro1 = args[0];
parametro2 = args[1];

Quero em seguida setar um label com o valor do parâmetro1 e outro label com o valor do parâmetro2.
labelx.setText(“parametrox”);

Não consigo setar isso diretamente do método main. Achei esse código aqui no fórum do GUJ, onde trabalho com as váriaveis fora do escopo main, porém ainda não consigo setar os labels.

[code]
import javax.swing.*;

public class MinhaClasse {
public String minhaString;
public MinhaClasse() {}

public static void main(String[] args) {
MinhaClasse minha = new MinhaClasse();
minha.minhaString = args[0];

mostrarValor(minha);

}

public static void mostrarValor(MinhaClasse minha) {
//System.out.println(minha.minhaString);
JOptionPane.showMessageDialog(null, minha.minhaString);
}
}[/code]

Diz que não posso fazer isso com um método static

Alguém pode me ajudar com essa simples dúvida de um iniciante?
Tem alguma outra maneira melhor de receber e USAR parâmetros quando inicio a aplicação?

Em que linha que dá o erro?? Porque isso deveria funcionar… O método mostraValor é estático, e o JOptionPane também…

obrigado thegoergen pela resposta.

Da maneira que está ai está funcionando, você está correto. O JOptionPane está OK.

Porém, no método mostraValor(), se eu tentar setar os labels com os parametros recebidos pelo main, não funciona.

public static void mostrarValor(MinhaClasse minha) {    
    //System.out.println(minha.minhaString);   
    //JOptionPane.showMessageDialog(null, minha.minhaString);  
    label1.setText("parametro1"); 
  } 

Estou utilizando netbeans, e a mensagem que recebo é que não posso fazer isso com o static.
Já tentei retirar o static, porém também consegui compilar.

Bom… agora sim tem problema.

Você é iniciante, certo? precisa ver um pouco mais sobre orientação a objetos… aquele teu label ali é uma propriedade da classe, então não é estático. Se você quer setar a variável minhaString no label, precisa fazer assim:

minha.label1.setText(minha.minhaString);

Perceba que o label1 é da INSTÂNCIA da classe MinhaClasse, e não uma variável estática dela.

Boa tarde thegoergen, mais uma vez obrigado por estar me ajudando a entender isso.

Sou iniciante sim, estou estudando Java, porém somente agora comecei a tentar fazer alguma coisa na prática.

Você me encorajou a mostrar meu vergonhoso código. Somente deixei o que interessa, veja só:

package br.com.formaspagamento;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;


public class FormaPgto extends javax.swing.JFrame {
    public String usuario;  
    public String dataBase;
    FormaPgto variaveis;
    
    DefaultTableModel tmFormaPgto = new DefaultTableModel(null, new String[]{"Código","Tipo","Descrição"});
    
    public FormaPgto() {
        initComponents();        
    }
    
    // código gerado pelo netbeans (só deixei o código relacionado a esse tópico)
    private void initComponents() {
		//...
        pnTopo = new javax.swing.JPanel();
        pnBotoes = new javax.swing.JPanel();
        pnRodape = new javax.swing.JPanel();
        lbUsuario = new javax.swing.JLabel();
        lbDataBase = new javax.swing.JLabel();
        pnMain = new javax.swing.JPanel();
		//-----------------------------------------		
        lbUsuario.setText("USUARIO:");
        lbDataBase.setText("DATA:");
		//-----------------------------------------
		//...
    }// final do código gerado pelo netbeans

    private void btSairActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btSairActionPerformed
        System.exit(0);
    }


    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FormaPgto().setVisible(true);
            }
        });
        
        FormaPgto variaveis = new FormaPgto();
        variaveis.usuario = args[0];
        variaveis.dataBase = args[1];
        setarLabel(variaveis);
    }
    
    public static void setarLabel(FormaPgto variaveis) {  
        //JOptionPane.showMessageDialog(null, variaveis.usuario);
        //JOptionPane.showMessageDialog(null, variaveis.dataBase);
        variaveis.lbUsuario.setText("USUARIO: " + variaveis.usuario);
        variaveis.lbDataBase.setText("DATA: " + variaveis.dataBase);
    }
    
    // + código gerado pelo netbeans
    private javax.swing.JButton btSair;
	//...código gerado pelo nb...
    private javax.swing.JLabel lbDataBase;
    private javax.swing.JLabel lbUsuario;
	//...código gerado pelo nb...
    private javax.swing.JPanel pnMain;
    private javax.swing.JPanel pnRodape;
    private javax.swing.JPanel pnTopo;

    
}

No painel do rodapé, quero setar esses 2 parâmetros nos labels lbUsuario e lbDataBase.
Início a aplicação assim: java -jar FormaPgto.jar joao 24/11/08

Da maneira que você me orientou, consegui compilar e fazer rodar sem nenhum problema - porém ainda não substitui o valor nos respectivos labels.

Desculpe importunar, mas tenho que resolver isso.

pessoal… desculpa ai… alguém pode dar uma olhada rápida no código acima?
está quase resolvido, mas não consigo setar esses labels.

No seu método main, você está criando 2 vezes a sua classe, e deve estar aparecendo errado. Repare:

 java.awt.EventQueue.invokeLater(new Runnable() {  
             public void run() {  
                 new FormaPgto().setVisible(true);  //Inicia uma vez, e aqui você não seta os labels
             }  
         });  
           
// Agora aqui embaixo você iniciia OUTRO, e daí sim coloca os labels.
         FormaPgto variaveis = new FormaPgto();  
         variaveis.usuario = args[0];  
         variaveis.dataBase = args[1];  
         setarLabel(variaveis);  
// porém... Voc não seta ele como visível:   
// Deve fazer assim:    variaveis.setVisible(true);

Tenta de novo assim:


 java.awt.EventQueue.invokeLater(new Runnable() {  
             public void run() {  
                 
         FormaPgto variaveis = new FormaPgto();  
         variaveis.usuario = args[0];  
         variaveis.dataBase = args[1];  
         setarLabel(variaveis);  
         variaveis.setVisible(true);
 
             }  
         });  
           

E possote dar uma dica de orientação a objetos? Olha esse método:

 public static void setarLabel(FormaPgto variaveis) {    
         //JOptionPane.showMessageDialog(null, variaveis.usuario);  
        //JOptionPane.showMessageDialog(null, variaveis.dataBase);  
         variaveis.lbUsuario.setText("USUARIO: " + variaveis.usuario);  
         variaveis.lbDataBase.setText("DATA: " + variaveis.dataBase);  
     }

Pode substituir por:

public void setarLabel () { // Não é estático // Ao invés de receber por parâmetro, você usa o THIS, que significa o objeto atual. this.lbUsuario.setText("USUARIO: " + this.usuario); this.lbDataBase.setText("DATA: " + this.dataBase); }
Para chamá-lo, não precisa de:

setarLabel(variaveis)

só coloque:

variaveis.setarlabel()

Obrigado thegoergen!
Sua explicação foi ótima.
Vou tentar colocar isso em prática.

Conseguiu fazer?

thegoergen, desculpe se estou lhe importunando, estou com essa sensação agora.
Mas você está me ajudando muito a entender isso, obrigado.

Voltando ao tópico:

Fiz exatamente como você orientou, no método main:

java.awt.EventQueue.invokeLater(new Runnable() {    
            public void run() {    
                  
        FormaPgto variaveis = new FormaPgto();    
        variaveis.usuario = args[0];    
        variaveis.dataBase = args[1];    
        //setarLabel(variaveis); MUDEI PARA variaveis.setarlabel()
        variaveis.setarlabel();
        variaveis.setVisible(true);  
  
            }    
        });   

em seguida, no método setarLabel():

public void setarLabel () {    // Não é estático  
      // Ao invés de receber por parâmetro, você usa o THIS, que significa o objeto atual.  
     // Vou procurar estudar também sobre o uso do THIS (objeto atual)   
       this.lbUsuario.setText("USUARIO: " + this.usuario);    
        this.lbDataBase.setText("DATA: " + this.dataBase);    
    }  

Ainda não consegui compilar. Nessas duas linhas abaixo

        variaveis.usuario = args[0];    
        variaveis.dataBase = args[1];    

ele me diz: Local variable args is accessed from within inner class; needs to be declared final

Verifiquei a diferença entre o modificador final e seu oposto, o abstract.
Pelo que pude ver, o modificador final impede que que as variáveis/métodos/classes sejam sobrescritos.
Não entendi, nesse código acima, de que forma estaria sobrescrevendo alguma coisa.

Coloquei o modificar final, segundo quickfix (acho que esse termo é do eclipse) do netbeans,

final String args[]

porém mesmo assim não funcionou.

Perdoe essa pobre alma que ainda não entende de Java thegoergen!!!

OFF: Que é isso, todo mundo tá aqui pra ajudar. E pode ter certeza, você não está importunando, porque está tentando fazer o código, e não pediu ele pronto…

Isso é problema de threads.

O Java precisa garantir que uma Thread não interfira na outra… tinha esquecido disso. na verdade esqueci porque não entendo direito.

Tente reitrar a chamada da nova thread, deixando assim apenas no main:

 FormaPgto variaveis = new FormaPgto();      
         variaveis.usuario = args[0];      
         variaveis.dataBase = args[1];      
         //setarLabel(variaveis); MUDEI PARA variaveis.setarlabel()  
         variaveis.setarlabel();  
         variaveis.setVisible(true);  

Ou então faça o seguinte, declare o variaveis como final:

 final FormaPgto variaveis = new FormaPgto();      

Só não me faça muitas perguntas sobre multithreading, eu realmente não sou um expert nisso…

deixei o método main como voce orientou, assim:

public static void main(String args[]) {  
FormaPgto variaveis = new FormaPgto();        
        variaveis.usuario = args[0];        
        variaveis.dataBase = args[1];        
        variaveis.setarlabel();    
        variaveis.setVisible(true); 
}

e o método setarLaber assim:

public void setarLabel () {
       this.lbUsuario.setText("USUARIO: " + this.usuario);      
       this.lbDataBase.setText("DATA: " + this.dataBase);      
    }

executo a aplicação da seguinte forma:
java -jar FormaPgto.jar usuario database

Obrigado, agora está funcionando!