Ola pessoal. Sou novo aqui.
Sempre que aprendo alguma linguagem, enfrento alguns problemas, como usar IDEs gráficas e aprender novas APIs.
Estou sempre lá fazendo exercícios e até programas bem bolados em modo console, até que chega na parte de eu usar alguma GUI. Em Java não foi diferente. Aprendi a programar em console, mas quando olho o código das APIs gráficas nada faz sentido. Tipo, eu aprendo a pensar em variáveis, depois a documentação vem falando sobre eventos… O fato é que não consigo implementar a lógica de um programa que desenvolvi em console para interface gráfica. A última API que tentei foi usar o Jframe [acho que é javax o nome da biblioteca, esqueci o nome]
Daí surgem as dúvidas:
1] É possível criar uma classe só com a parte computacional [variáveis, somadores,…] separado da interface?
2] Quais partes do código de um evento posso usar para chamar variáveis e funções de outras classes?
3] Porque em todo código que vou usar em tutorial ou gerado pela própria IDE dá erro? O código gerado pelo próprio Netbeans não deveria estar perfeito? Isso acontece muito em c++ também
4] Existe alguns sites com exemplos [acho que a própria máquina java tem exemplos em alguns confins de suas milhares de pastas]
Serei grato se tirarem minhas dúvidas
nbinario,
Algumas questões que colocou são resolvidas com o uso da orientação a objetos principalmente interfaces e classes anônimas , então uns aconselhos:
- Entenda bem a orientação a objetos
- Se quizer realmente aprender Swing , use o Eclipse e crie as suas janelas na mão! Na mão??? Sim por que assim vc vai saber o que está fazendo, pegar o Netbeans sem saber como funciona acontece isso [quote] “… todo código que vou usar em tutorial ou gerado pela própria IDE dá erro…” [/quote]. Depois que vc aprender aí vc usa a IDE que quizer (o próprio Eclipse tem plugin pra cria janelas visualmente).
Suas questões:
- Claro. Voce cria classes que tenham somente os métodos que executam as tarefas desejadas (esses métodos recebem os dados e retorna os resultados), istó é , classes que tenham somente a essa responsabilidade, sem se preocupar com a parte GUI que fica a cargo p. ex. do JFrame. Uma classe Calculadora p. ex teria basicamente 4 métodos (somar,subtrair,dividir e multiplicar), TelaCalculadora seria uma classe que extends JFrame onde vc colocaria os componntes visuais.
- De dentro do método executado pelo evento (de uma olhada no exemplo no final)
- Vide conselhos
- Sites “a rodo”, alguns :
http://docs.oracle.com/javase/tutorial/uiswing/examples/components/index.html
http://www.java2s.com/Code/Java/Swing-JFC/CatalogSwing-JFC.htm
http://www.youtube.com/watch?v=gwz9H6sLQBw video aula sobre eventos.
Exemplo:
package exemplo;
/**
* classe só cuida de mensagens de saudacao
*/
public class MensagemSaudacao {
/** recebe um nome e retorna uma String com uma saudacao */
public String exibeSaudacao(String seuNome) {
return "Como vai " + seuNome + " ?";
}
}
Tela:
package exemplo;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.WindowConstants;
public class Tela extends JFrame {
private JLabel label1;
private JButton btnOk;
public Tela () {
setTitle("Contatos");
setSize(250,150);
setLocation(150,100);
this.setLayout(null);
label1 = new JLabel("Código");
label1.setBounds(15,10,50,15);
this.getContentPane().add(label1);
btnOk = new JButton("Ok");
//eventos do Button sao adicionados através do método addActionListener
//addActionListener recebe uma classe que implementa a interface ActionListener
//normalmente usa-se uma classe anonima que implementa esta interface como no exemplo
//o método actionPerformed é executado quando ocorre o evento
btnOk.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
//aqui instancio a classe Mensagem e executo o metodo de saudacao
MensagemSaudacao msg = new MensagemSaudacao();
//passo o argumento com o meu nome pro metodo para me retornar a String com a mensagem
String retornoMensagem = msg.exibeSaudacao("nbinario ");
//o retorno eu uso pra exibir um JOptionPane
JOptionPane.showMessageDialog(null, retornoMensagem);
}
});
btnOk.setBounds(15,50,150,25);
this.getContentPane().add(btnOk);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Tela().setVisible(true);
}
}
Excelente explicação. Muitíssimo obrigado.
Inclusive renome-ei a classe de mensagem para classe, e mantive o “Tela” para ficar mais didático.
Esse método de evento funciona em qualquer Jframe?
Curiosamente não consegui executar no console javac, mas somente no NetBeans. Quando tento chamar pelo javac aparece a seguinte mensagem:
Exception in thread "main" java.lang.NoClassDefFoundError: Tela/class
Caused by: java.lang.ClassNotFoundException: Tela.class
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: Tela.class. Program will exit.
Consigo executar o código somente no NetBeans. Já tentei usar o sudo chmod +x <class.class> e nao funcionou.
Quando eu fazia exercícios em console não tinha esse problema. Será que o javac também precisa de bibliotecas instalados nele?
Estou usando o Ubuntu 12.04.1
Acredito que minha inexperiência com IDEs, falta de exercício com OOP, e até adiamento de aprender APIs novas tenha atrapalhado meu aprendizado.
O último problema que enfrento que não consigo rodar o Aplet fora do NetBeans.
Eu seria altamente grato se me ajudasse com esse último probleminha deste pobre noob metido a desenvolvedor.
Mesmo se não poder, já ajudou prakas, e estou muito grato e confiante para continuar meus estudos em Java.
Grato a atenção desde já
Bom,
Esse erro ocorre porque ele não está encontrando o .class ao executar.
Quando vc usa o javac quanto o java via console tem que usar a opção -classpath ou -cp , apontando para o diretório onde estão as classes compiladas - os arquivos class. De dentro do diretório da aplicação vc executa java -cp build/classes Tela levando em consideração que seus arquivos compilados estejam no subdiretório do projeto/build/classes, caso esteja diferente substitua no -cp.
É bom vc saber compilar e executar via linha de comandos, mas pra aprender a linguagem chega um ponto onde vc tem fazê-lo pela IDE e deixar de lado o prompt pois vc tem que se preocupar com a linguagem,seus recursos, padrões e outras coisas mais.
Aconselho a deixa o prompt de comando um pouco de lado (a menos que seja totalmente necessário p/ vc) e foque na programação e si.
Vou abandonar [entre aspas] meu velho amigo console de estudos.
Tomei uma coça para fazer o código ser executável no Ubuntu. Primeiro testei no NetBeans, deu tudo certo. Mas não sei fazer o NetBeans compilar um “executável” se é que me entendem, ou seja um arquivo JAR. Quando passei para o eclipse, simplesmente não consegui importar. Tentei criar do zero, deu erro, Descobri que tinha nomeado a classe errado. Concertei, nada de gerar o arquivo JAR. Acusava o falta do método Main. Quase postei o problema aqui, mas insisti até finalmente descobrir que dava para configurar o método main no Wizard, e ainda tinha que dar permissão do Linux para rodar em JavaRuntime7 usando a opção “permitir rodar como programa [algo assim]”. No windows acho que não terei problema.
O fato é que estou pensando em desenvolver programas para clientes de empresas e precisarei disso tudo.
Eu sei, eu sei…engenharia reversa, propriedade intelectual, etc. Mas tem as regalias como ser multiplataforma, alta documentação, OOP.
Estou pensando em aprender Python para quando voltar para JAVA, vir com a cabeça mais esclarecida.
Eu achava em meu tempo ingênuo que bastava “dominar” [se é é que existe alguém que domine toda a documentação do Java] a sintaxe, lógica, que tava de boa. Engano de um noob :[ . Isso me lembra quando tentei instalar as variáveis de sistemas pela primeira vez. Fiquei dias sem querer estudar JAVA.
Muito obrigado Luiz.
Espero que a surra que tomei sirva de ajuda para outros aventureiros. Vou ver se acho alguma sessão aqui no Fórum para OOP
Trabalho profissionalmente com Desenvolvimento a 1 ano, com Java, até hoje não sei trabalhar com Swing e espero não precisar aprender. Trabalho mais com back-end e pouco com front-end web.
Se precisar fazer uma janela vou usar recursos da IDE, acho que não vale a pena digitar tanto.