Dúvida sobre variáveis e métodos estáticos (JOptionPane)

Dae galera! Seguinte: estou fazendo um trabalho de engenharia de usabilidade, e o professor pediu que para a exibição de mensagens ao usuário, fosse usada uma classe com métodos estáticos igual ao JOptionPane

Bom, no JOptionPane, uma das formas (a que sempre uso), entre outras sobrecargas é chamá-lo da seguinte forma:

 JOptionpane.showMessageDialog(null, "Mensagem a ser mostrada ao usuário"); 

No caso do meu trabalho, é pra ser feita a mesma coisa (chamada estática), com alguns parâmetros diferentes:

 Dialogo.mostrarDialogo("Titulo da Janela", "Mensagem ao usuario", true, "imagens/imagemTeste.GIF"); 

A única coisa que muda são os parâmetros.

A minha dúvida é: como devo estruturar o construtor e este método estático na classe ‘Dialogo’ para a chamada acontecer do mesmo jeito? Olhei a classe do JOptionPane, mas é muito extensa, difícil de entender.

OBS: a parte lógica jah está pronta, minha dúvida é qto à sintaxe de variáveis e métodos estáticos, por isso vou demonstrar somente as partes que interessarão no entendimento, ok? :slight_smile:

Minha classe basicamente é essa: (não estou com ela aqui, vou fazer de cabeça)

public class Dialogo extends JDialog {

	private JLabel jLMensagem;
	private JLabel jLImagem;
	private JButton jBFechar;

/*1ª DÚVIDA: já que o método mostrarDialogo receberá 
os parâmetros, preciso declarar esses tipos como estáticos e globais? */

	private static String titulo;
	private static String mensagem;
	private static boolean sucesso; /*sucesso ou não na transação, q poderá ocorrer de várias formas */
	private static String imagemClassPath; /*setar o caminho da imagem, que estará em um pacote dentro do projeto*/

/*2ª DÚVIDA: O que devo inicializar no construtor? Será que devo fazer uma sobrecarga? Ou deixo vazio?
não entendi essa parte, pois nenhum objeto é criado, então não sei o q fazer no construtor.
devo tratar alguma coisa referente aos tipos estáticos definidos anteriormente aqui no construtor? */
	public Dialogo() {
		inicializarComponentes(); /*chamada de método criada pelo NetBeans para inicializar os componentes GUI*/
	}

/*3ª DÚVIDA: os parâmetros devem ser passados aqui mesmo?*/
	public static void mostrarDialogo(String titulo, String mensagem, boolean sucesso, String iconeClassPath) {
		this.titulo = titulo /*se eu fizer isso gera uma exceção non-static*/
		/*tratamento do método para configurar a janela conforme os parâmetros passados*/
	}

/* 4ª DÚVIDA: devo chamar este método no construtor mesmo? Pois não entendi a real função de um construtor que não recebe parâmetros numa classe com métodos estáticos */
	public void inicializarComponentes() {
	/*inicialização e configuração dos três componentes GUI*/
	}

/*5ª DÚVIDA: os getters e setters devem conter algo diferente?
por último vÊm os getters() e setters() das variáveis estáticas criadas*/
}

Acho q era isso. A classe é bem simples, mas apesar de já ter aprendido teoricamente o ‘static’, nunca tinha usado em prática, por isso sou leigo no assunto :slight_smile:
A necessidade mesmo é só fazer um JOptionPane com menos possíbilidades, chamado exatamente da mesma forma, mas mais “bonitinho”, já q o projeto é para desenhar interfaces amigáveis… :slight_smile:

Obrigado! E desculpem a falta de conhecimento…
CNA

Quando você utiliza métodos estáticos, os construtores são inúteis, pois eles não são chamados, já que não há a criação de um objeto.

Os métodos estáticos são chamados sem instanciar nenhum objeto, são métodos da classe e não do objeto.

Portanto as perguntas pertinentes aos construtores estão respondidas.

As variaveis que voce acessar dentro dos metodos estaticos, que estejam associadas a mesma classe, deverao ser declaradas estaticas também…

E também não vejo muita utilidade em usar getters e setters para uma classe que você nao vai instanciar um objeto…

Vc pode utilizar blocos estaticos para executar alguma coisa durante a inicialização da classe


...

static{
//codigo inicializacao
}

ok, até aí eu entendi… :stuck_out_tongue:

agora, como q faço pra chamar um método não estático, com objetos não estáticos dakele meu método mostrarMensagem?
no caso, já q o construtor é inútil, tenho q inicializar os componentes dakele método, q é o único.
Tb não entendi cm fica a passagem de parâmetros pro método mostrarMensagem
será q tem algum modelo q eu possa consultar?
vlw denovo

Comece por fazer a classe normalmente


public class Dialog extends JDialog {

        private JLabel jLMensagem;
 	private JLabel jLImagem;
 	private JButton jBFechar;

        Dialog (){

        }
}

Agora repare que os atributos são classes gáficas, são ocmponenetes.
Então sem duvida vc vai usar eles para mostrar informações. Quais ?
Básicamente aqueles qe vc está passando no métodos estáticos. Mas como ?

Assim


public class Dialog extends JDialog {

        private JLabel jLMensagem;
 	private JLabel jLImagem;
 	private JButton jBFechar;

        Dialog (){

        }

         public void setMensagem (String mensagem){
                    this.jLMensagem.setText(mensagem);
         }

         public void setIcon(Icon icon){
                    this.jLImagem.setIcon(icon);
         }

 
}

Mas os objectos gráficos não foram inicializados, eles ainda são null, então precisa de criá-los e colocá-los num layout , para isso serve o inicializarComponentes(). Mas repare que eu o fiz private assim como o construtor. Depois eu explico o construtor , mas o inicializarComponentes() é porque vc vai chamar ele no construtor. Tecnicamente vc deveria inicializar tudo no construtor, mas para facilitar a leitura vc decide colocar noutro método só para isso. Excelente. Mas lembre-se que construtores não são herdados, então os métodos internos que eles chamam tb não devem ser posiveis de herdar. E por isso o private. Como o construtor já é private isto é meio redundante, mas é uma boa prática e por isso é bom fazer sempre, mesmo quando parece redundate.

E fica assim:


public class Dialog extends JDialog {

        private JLabel jLMensagem;
 	private JLabel jLImagem;
 	private JButton jBFechar;

        private Dialog (){
              inicializarComponentes() ;
        }

         public void setMensagem (String mensagem){
                    this.jLMensagem.setText(mensagem);
         }

         public void setIcon(Icon icon){
                    this.jLImagem.setIcon(icon);
         }

        private void inicializarComponentes() {
 	/*inicialização e configuração dos três componentes GUI*/
          this.jLMensagem = new JLabel(); 
          // etc
          // inicliza um LayoutManager legal para dispor os componentes 
          this.add(jLMensagem)
 	}
}

Ah! agora já funciona. Mas para o que eu vou usar isto ?
Para mostra mensagems. bom, então é chato eu ter que fazer New Daialog a toda a hora. Melhor usar ums métodos de atalho. E para garantir que ninguem estraga esses atalhos vou fazer com que apenas por eles seja possivel mostrar o dialog. Por isso o contrutor é private , para que a classe não possa ser extendida.


public class Dialog extends JDialog {


        // métodos estáticos 
public static void mostrarDialogo(String titulo, String mensagem, boolean sucesso, String iconeClassPath) {

                  Dialog dialog = new Dialog();
                  dialog.setTitle(titulo);
                  dialog.setMensagem(mensagem);
                   dialog.setIcon( ... cria icon com base no caminho e coloca aqui);
 // o boolean nã sei para que serve. 

                   dialog.show(); // mostra o dialogo
 	}

        private JLabel jLMensagem;
 	private JLabel jLImagem;
 	private JButton jBFechar;

        private Dialog (){

        }

         public void setMensagem (String mensagem){
                    this.jLMensagem.setText(mensagem);
         }

         public void setIcon(Icon icon){
                    this.jLImagem.setIcon(icon);
         }

        private void inicializarComponentes() {
 	/*inicialização e configuração dos três componentes GUI*/
          this.jLMensagem = new JLabel(); 
          // etc
          // inicliza um LayoutManager legal para dispor os componentes 
          this.add(jLMensagem)
 	}
}

Não precisa de nenhuma variável estática.
não se faz get/set em variáveis estáticas, a mesmos que os get/set sejam eles mesmo estáticos.
Faltam coisa ai, mas acho que deu para entender como usa o método estático. É apenas um facilitador.

Nota: O JOptionPanetem um constutor publico, mas isso é porque o JOptionPane não é um JDialog ele é um componente como um label ou um textbox. Só que a sua função é aparece em dialogs e por isso os métodos estáticos de JOptionPane fazem esse trabalho de setar o dialog e o JOptionPane e colocar os dois juntos e mostrar na tela ,etc… No sue caso Dialog extende JDialog , portanto a mesma lógicca não se aplica e é bom deixa o construtor privado. Pode ainda acrescentar um final na declaração da classe só para garantir que ninguém tem a ideia de extender a sua classe especial.

cara, valeu mesmo! grande explicação!
eu q nunca tinha usado métodos estáticos na prática, consegui entender direitinho a lógica da coisa! vlw mesmo! :slight_smile:

CNA