Novo em Swing

Pessoal, sou novo em Swing. Queria fazer um pequeno programa em Java que me ajudasse a controlar um serviço de internet que tenho aqui no prédio. Ex.: Cadastrar Novo Usuário, Excluir Usuário, Editar, Confirmar pagamento, etc. Pensei em uma boa solução de banco: Oracle Express 10g. O que acham? Poderiam me enviar algum link com tutorial sobre isso? Algo que possa me ajudar a começar e dar um bom encaminhamento?

Agradeço desde já.

Primeira coisa que vc tem que pensar eh vc ja tem experiencia com programacao?
Experiencia com Java?

Se nao tiver nenhum experiencia com Java aconselho primeiro dar um estudada na linguagem, conceitos OOP etc.
Depois vc pode estudar JDBC ( que vc vai precisar pra fazer as operacoes com o banco de dados)
Quando vc tiver confortavel com isso, parte pro Swing.

Aqui tem uma introducao boa em Java e OOP

Aqui no GUJ mesmo tem uns artigos sobre JDBC
http://www.guj.com.br/java.tutorial.artigo.7.1.guj (introducao)

Swing, eu nao sei onde vc pode achar um bom material eu mesmo aprendi muitas coisas buscando exemplos na net, participando aqui do forum e pesquisando a API.

//Daniel

[quote=WaVe]Pessoal, sou novo em Swing. Queria fazer um pequeno programa em Java que me ajudasse a controlar um serviço de internet que tenho aqui no prédio. Ex.: Cadastrar Novo Usuário, Excluir Usuário, Editar, Confirmar pagamento, etc. Pensei em uma boa solução de banco: Oracle Express 10g. O que acham? Poderiam me enviar algum link com tutorial sobre isso? Algo que possa me ajudar a começar e dar um bom encaminhamento?

Agradeço desde já.[/quote]

Se você pretende aprender a programar em Java, começe pensando em usar ferramentas free/open source se você for programar para voce mesmo. O Oracle é um ótimo gerenciador de banco de dados, porém é pago e implica em você ter que desembolsar alguns R$R$R$ para utiliza-lo, para não entrar no mundo da pirataria. Eu o aconselho utilizar o MySQL ou até mesmo o HSQLDB já que sua aplicação não exige muita coisa.

Já tenho experiência em Java sim, faço Ciências da Computação. Meu calo agora é Swing e Comunicação com Banco. Quanto ao BD Oracle esta versão Oracle Express é totalmente FREE. Obrigado pelas dicas, quem puder me dar mais algumas, serão sempre bem vindas.

Não sabia do Oracle Express, existe? Agora em termos acadêmicos, não se adiquire exepriencia em faculdade meu rapaz… a experiencia vem da prática.

Existe sim cara… é um Banco de Dados Oracle FREE para pequenas aplicações, instalei ontem na minha máquina. Muito bom! O nome é Oracle Express.

Cara,
se vc utiliza o Eclipse eu aconselho vc a usar VE(Visual Editor), é bem tranquilo pra trabalhar com Swing :wink:

Ja para fazer a conexão com banco de dados é so vc da uma estudada em JDBC: http://java.sun.com/docs/books/tutorial/jdbc/overview/index.html

[]'s

Se você programa em Swing, já te dou uns conselhos desde já:

  1. Não use o DefaultTableModel. Ele vai estar nos exemplos, mas é só de exemplo que ele serve. Na prática, faça seu próprio Tablemodel ou, melhor ainda, use o do projeto Towel.

Ótimos artigos sobre isso estão aqui:
http://www.informit.com/articles/article.aspx?p=332278
http://www.informit.com/articles/article.aspx?p=333472

Há mais exemplos nos links da minha assinatura.

O mesmo vale para o DefaultMutableTreeNode. Prefira criar seu próprio TreeModel, como descrito aqui.

  1. Não use Nullayout, ou redimensione componentes com setBounds. Eu sei que pode ser tentador as vezes, que lembra o Delphi e o VB, mas não faça isso. Usando esse layout, sua aplicação não suportará redimensionamento das janelas, não rodará em diferentes look&feel e você ter problemas ao troca-la de sistema operacional. No lugar, informe-se sobre os gerenciadores de layout, em especial, sobre o BorderLayout, FlowLayout, GridBagLayout e, se vc usar o matisse, sobre o GroupLayout. Outra boa opção é usar uma API de terceiros, chamada de MigLayout;

  2. Aprenda como as coisas funcionam. Visual editor e matisse são legais, mas procure entender os conceitos por trás do Swing. Em especial, como funciona a divisão de model/view-controller dentro dele. Também aprenda como o Swing trabalha com sua thread. Você precisará criar conteúdo dinâmico cedo ou tarde e será importante saber como fazer janelas no braço.

  3. Não tente modificar o comportamento padrão das coisas, caso o Swing não dê para você essa possibilidade “built-in”. Por exemplo, muita gente se incomoda pelo fato das barras de títulos dos internal panes do Swing não desaparecerem quando a janela é maximizada. Bem, é assim que é, e mudar esse comportamento vai te gerar um código difícil de manter, complexo e que dificilmente vale o esforço. É mais provável que seu usuário toparia de maneira diferente, ou nem se incomodaria tanto com isso assim;

  4. Se for sobrescrever componentes, lembre-se que o método de pintura para ser sobrescrito é o paintComponent, não o paint. Também será necessário tirar uma cópia do objeto graphics recebido no parâmetro antes de usa-lo. Não tenha a brilhante idéia de sobrescrever um JPanel que contem outros botões, textos, etc. Não chame repaint() de dentro dos métodos paint e paintComponent, já que ele irá chamar esses mesmos métodos. Sobrescrever componentes é uma tarefa complexa, não despreze-a. Leia sobre como funciona a pintura no Swing e como trabalhar com Graphics2D antes de iniciar a faze-lo.

  5. Processamentos pesados devem ser feito fora da thread do Swing. Use a classe SwingWorker para disparar uma outra thread e faze-lo. Processamentos feitos em outras threads não devem atualizar componentes do Swing diretamente. Chame o método EventQueue.invokeLater() ou EventQueue.invokeAndWait() para isso.

  6. Nunca chame setVisible(true) no construtor de suas janelas. É uma boa prática deixar a escolha de quando a janela se tornará visível para quem deu “new” nela. Além disso, isso também garante que todos os componentes já estarão presentes na janela quando ela se abrir. Lembre-se que até que o construtor termine, a janela sequer foi construída totalmente ainda e torna-la visível é nesse momento é no mínimo estranho.

  7. Não misture componentes do Swing com os da AWT. Além de ser completamente desnecessário, os componentes da AWT sempre ficarão acima dos componentes do Swing, por serem heavy-weight. Aliás, não há razões para você usar componentes AWT hoje em dia. Um erro comum é criar filhos de Window ou Canvas ao invés de JComponent.

  8. KeyListeners dificilmente vão resolver seus problemas. Para validar campos de texto (JTextField, JTextArea, JTextPane), informe-se sobre os objetos Document e o InputVerifier. Existe até um tutorial no GUJ a respeito do Document. Para disparar eventos através do teclado, conheça o InputMap e o ActionMap, como nesse exemplo de uma calculadora. Quando pensar no KeyListener, lembre-se que seu usuário geralmente pode usar CTRL+C e CTRL+V com o mouse, e você vai ver que a solução não passa por aí.

  9. Trate eventos separadamente. Fazer seu JFrame implementar actionListener e redirecionar todos os eventos para um único actionPerformed, além de uma grande estupidez, gera código espaguete e exige que você novamente separe esses eventos num switch, o que piora a performance do código. Use no lugar uma inner class anônima para cada evento, ou melhor ainda, implemente Actions.

  10. Evite usar o DesktopPane e o InternalFrame. Sua implementação simplesmente não é boa. A barra de títulos do InternalFrame não desaparece quando ele é maximizado, não aparecem barras de rolagem no desktop pane caso um internal frame fique fora da área dele. Note também que aplicações MDI tem desaparecido até do Windows. O próprio Office não é mais assim;

  11. Comunique dados entre janelas através de passagens de parâmetros, nunca através de variáveis estáticas.

  12. Evite usar Singletons. Dois locais comuns onde você pode ficar tentado é na construção de janelas e na conexão com o banco de dados. Janelas singleton são menos reutilizáveis e nunca são elegíveis para garbage collection. Conexões com o banco de dados singleton sempre ficam abertas, desperdiçam recursos do banco, não tratam situações de erro (como quando o banco as fechou), não funcionam bem com múltiplas threads. Não constitui boa prática de desenvolvimento manter recursos ociosos abertos. No lugar, use um ConnectionPool, como o Jakarta DBCP ou o C3P0 ou, melhor ainda, use um mapeamento objeto relacional, como o Hibernate. Se precisar de janelas singleton, considere o uso de uma só classe singleton chamada WindowManager, que controle o acesso a instâncias que devem ser compatilhadas, mas não tire a possibilidade de reinstanciar a janela. Lembre-se que variáveis estáticas (inclusive a dos singletons) são as principais fontes de memory leaks e são péssimas em ambientes multi-thread.

  13. Lembre-se que o primeiro parâmetro do JOptionPane e do JFileChooser deve ser a janela que está abrindo o OptionPane, e nunca null. O null você só usará em aplicações desktop, quando não houver outras janelas abertas. Normalmente, em aplicações Swing, o valor correto será this. Esquecer desse detalhe irá gerar um comportamento estranho no alt+tab. Não sei porque, mas muitos GUJnautas tem mania de usar null, ignorando o que deveriam ter lido na documentação.

  14. No mais, saiba que para obter ajuda para um componente do Swing basta ir no google e digitar “How to <nomeDoComponente>”. Por exemplo, para achar ajuda sobre o JLabel, digite How to JLabel. O link da Oracle com um artigo explicativo e exemplos será exibido entre os primeiros da lista em 99.9% das vezes.

Finalmente, divirta-se. O Swing é muito poderoso. Embora no início ele possa parecer complicado, nunca trabalhei com um pacote tão poderoso de classes quanto ele. Ele é flexível, robusto e fácil de programar.

1 curtida

Pergunta ao ViniGodoy,

Sobre deixar de usar MDI, qual seria a alternativa viável?

Porque tenho um sistema que usa MDI onde o usuário abre algumas janelas dentro de um JDesktopPane e fazer isso espalhando janelas no ambiente não ficaria interessante nesse caso.

Uma das alternativas é usar abas, como faz o FireFox. Outra é realmente encher de janelas, como os aplicativos tem feito.

Entretanto, é como eu falei. É bom evitar o InternalFrame, ou seja, se for projetar sistemas novos, pense em alternativas à esse recurso.