Iniciante... Projeto para vocês analizar

24 respostas
A

Olá

Eu sou iniciante em Java, mas já desenvolvo em vb.net.

Fiz um projeto simples que pra mim as principais funções (Conexão com o banco, Insert, Update, Delete e Select)

Estou enviando o projeto para vocês dar uma olhada e dar suas opniões.

Algumas dúvidas:

1 - Como fazer que a conexão com o banco abrir na hora que o programa é aberto e só fechar quando o programa é fechado… porque ai toda hora que ia fazer alguma transação com o banco tive que abrir a conexão de novo… isso acho eu que deixa o programa mas lento.

2 - Tive algumas dificuldade de montar o layout do Jframe… Exemplo: Retirar as bordas, mudar de cor, posicionamento dos componentes, as vezes mexia em um e o outro mudava de posição, fixar o tamanho do JFrame para que não seje alterado.

3 - Qual componente utilizo para adicionar imagem no JFrame, porque no vb.net eu modifico o layout dos form com imagens criando assim Skins. Como posso fazer isso no Java?

24 Respostas

A

Esqueci de mencionar… estou utilizando o NetBeans IDE 6.9.1 com MySQL

E

vamos la, vou tentar te ajudar…
1º se vc quer cria a conexao no inicio e ficar com ela aberta o tempo todo he bem facil, basta vc criar a conexao dentro do seu Frame principal logo abaixo do initComponents, ai vc so teria que passar esta conexao para suas classes ( por parametros).
Mas fique claro q sera mto melhor vc abri-la somente quando for usar… pelo menos para mim é melhor

Ex:

initComponents();
    Conexao conexao = new Conexao();

e para fechar é so colocar para fecha-la no momento q o usuario fechar a aplicacao…

2º Nesta questao o seu problemas esta com o layout que vc esta usando, eu particularmente gosto dele, mas leva tempo para pegar as moral…rsrs, mas para resolver o seu vc pode colocar o layout como null, assim vc pederia desenhar livremente…

3º uso um JLabel para colocar imagens

laudenpower

elmarquinhos:
vamos la, vou tentar te ajudar…
1º se vc quer cria a conexao no inicio e ficar com ela aberta o tempo todo he bem facil, basta vc criar a conexao dentro do seu Frame principal logo abaixo do initComponents, ai vc so teria que passar esta conexao para suas classes ( por parametros).
Mas fique claro q sera mto melhor vc abri-la somente quando for usar… pelo menos para mim é melhor

Abrir e fechar uma conexão em uma aplicação desktop muitas vezes pode azedar o processamento, principalmente se for um processamento “real time” pois isso tem um custo relativamente alto, tipo o ideal é abrir uma vez e não criar mais nenhuma conexão reutilizando a mesma em outras classes. Quanto ao fato de abrir no form principal, acho que não fica legal sendo que o ideal é utilizar o padrão DAO para encapsular o acesso à conexão no construtor de cada DAO (ClienteDao, ProdutoDao, etc…), nesse caso pode se criar uma classe que fornece a conexão, podendo ser até um singleton (muitos podem me apedrejar nesse ponto).
Quanto a fechar a conexão ela se fecha quando a aplicação dá um “System.exit(0);”, ou quando o usuário fecha o jframe principal.

A

Seria possível fazer essa alteração da conexão no projeto que enviei ai de exemplo adicionar ele novamente… porque não entendi como fazer.

Eu vi um exemplo de adicionar imagem com JLabel mas a imagem não redimenciona junto com o JLabel.

Como faço para retirar as bordas do JFrame, mudar a cor…

ViniGodoy

Essa é uma péssima prática de programação. Não fechar a conexão consome recursos, e muitas vezes pode representar um memory leak. A melhor solução é procurar uma biblioteca que faça o pooling de conexões, como já faz o .net já faz automaticamente. Dê uma olhada no DBCP ou no C3P0.

Usar um singleton para fornecer uma única conexão, então, nem se fala. É uma idéia péssima e muito popular.

Aprenda a usar os gerenciadores de layout. O .net mesmo usa um padrão parecido, com o BorderLayout e o FlowLayout. Uma boa alternativa é aprender a usar o MigLayout: http://www.miglayout.com/

É normal ter um pouco de dificuldade de posicionar componentes no começo. Exige estudo, mas de brinde você ganha janelas que podem ser redimensionadas, sem que você tenha que recorrer a cálculos para isso.

No Java você pode usar o JLabel para inserir imagens. Mas não entendi o efeito de skins que vc quer fazer.

ViniGodoy

Dê uma olhada no JImagePanel, se quiser redimensionar a imagem:
http://www.guj.com.br/posts/list/56248.java#295271

laudenpower

Essa é uma péssima prática de programação. Não fechar a conexão consome recursos, e muitas vezes pode representar um memory leak. A melhor solução é procurar uma biblioteca que faça o pooling de conexões, como já faz o .net já faz automaticamente. Dê uma olhada no DBCP ou no C3P0.

Usar um singleton para fornecer uma única conexão, então, nem se fala. É uma idéia péssima e muito popular.

Mas nesse caso o pool vai iniciar no programa do cliente abrindo um determinado número de conexões? Tipo eu configurei o pool na maquina do cliente para 5 conexões, nesse caso o cliente vai começar a aplicação com 5 conexões que se multiplicado por seilá 20 clientes resultam em 100 conexões abertas no banco de dados. Agora se a camada DAO estiver no servidor talvez isso seja o mais correto mesmo, uma vez que você diminui 20 conexões abertas (caso cada cliente tenha uma aberta o tempo todo) para 5 conexões que podem ser expandidas conforme a necessidade. Mas ainda assim tenho um aplicativo de automação industrial onde existe vários processos que devem acontecer na casa dos millisegundos, onde se cada vez que eu ir no banco eu tiver que criar uma conexão e fechar, o aplicativo simplesmente não funciona, por isso que defendo a conexão aberta no aplicativo, principalmente quando você precisa acessar o banco N vezes em questão de 1 segundo.

ViniGodoy

É só configurar seu Pool para começar com uma única conexão, ao invés de 5. E crescer dinamicamente conforme a necessidade.

Meu uso de java foi exclusivamente para automação industrial, também em aplicações de tempo real. Nunca usei para web.

laudenpower

É só configurar seu Pool para começar com uma única conexão, ao invés de 5. E crescer dinamicamente conforme a necessidade.

Meu uso de java foi exclusivamente para automação industrial, também em aplicações de tempo real. Nunca usei para web.

Porém nesse caso teriamos o mesmo efeito prático de ter uma conexão aberta no cliente, a menos que o pool faça um tratamento diferente dessa conexão onde ele não fecha a conexão na aplicação mas também não deixa ela aberta no BD.

ViniGodoy

Sim, o pool faz diversos tratamentos:

  1. Reiniciar a conexão caso fique muito tempo ociosa;
  2. Verificar se a conexão é saudável antes de entrega-la para aplicação;
  3. Abrir uma segunda conexão, caso você tenha múltiplas threads rodando e a conexão principal esteja ocupada;
  4. Garantir que a entrega da conexão vai ser thread-safe, sem o risco de compartilhar a conexão entre threads distintas;
  5. Não ter problemas entre multiplos classloaders;
laudenpower

Sim, o pool faz diversos tratamentos:

  1. Reiniciar a conexão caso fique muito tempo ociosa;
  2. Verificar se a conexão é saudável antes de entrega-la para aplicação;
  3. Abrir uma segunda conexão, caso você tenha múltiplas threads rodando e a conexão principal esteja ocupada;
  4. Garantir que a entrega da conexão vai ser thread-safe, sem o risco de compartilhar a conexão entre threads distintas;
  5. Não ter problemas entre multiplos classloaders;

Não sei por que mas isso tá com chero de overhead… Fazer isso tudo deve consumir um bocado de tempo se compararmos com a abertura da conexão no inicio da aplicação.

ViniGodoy

No fundo, o pool vai fazer exatamente isso. Abrir uma conexão no início da aplicação e mante-la aberta.
Ele só tem uma thread que roda de tempo em tempo para trocar a conexão aberta por outra, antes que o banco a feche. Isso evita leak de recursos, e evita que a conexão expire subitamente.

Se você precisar deixar sua máquina ligada por horas seguidas, isso é essencial. Senão logo você terá mensagens de “Connection reset by peer” na sua aplicação.

Se você trabalhar com múltiplas threads, também é essencial que você não use uma conexão só.

E se vc trabalhar com múltiplos classloaders, vai ter problema, pq o padrão Singleton quebra nessa situação.

O overhead do que eu falei é desprezível.

laudenpower

ViniGodoy:
No fundo, o pool vai fazer exatamente isso. Abrir uma conexão no início da aplicação e mante-la aberta.
Ele só tem uma thread que roda de tempo em tempo para trocar a conexão aberta por outra, antes que o banco a feche. Isso evita leak de recursos, e evita que a conexão expire subitamente.

Se você precisar deixar sua máquina ligada por horas seguidas, isso é essencial. Senão logo você terá mensagens de “Connection reset by peer” na sua aplicação.

Se você trabalhar com múltiplas threads, também é essencial que você não use uma conexão só.

E se vc trabalhar com múltiplos classloaders, vai ter problema, pq o padrão Singleton quebra nessa situação.

O overhead do que eu falei é desprezível.

É capaz de eu fazer um teste… Nesse caso esse software é multithread (e BEM multithread) e tive que realizar uma série de tratamentos para resolver problemas com deadlock. Nesse caso o singleton eu vejo em aplicações onde existe apenas um classloader e uma thread. Em ambientes concorridos a coisa é outra e o singleton não resolve mesmo. Mas a questão do singleton eu não acho legal mesmo para esse caso (disse que era possível, mas não desejável).

A

Olá

ViniGodoy… o que estou querendo fazer com o form é isso…

Essa tela eu fiz em Vb.Net utilizando o componente PictureBox e fui adicionando imagens e montando o layout que queria.

Como consigo fazer semelhante ou igual no java?

A

Não entendi esse gerenciador de layout…

http://www.miglayout.com/

Como funciona?

ViniGodoy

Consegue sim.

Como é um form de login, você não irá redimensionar, pode usar o setUndecorated(true). isso irá tirar a barra de título e os botões de redimensionamento. Também dê um setResizable(true), para garantir que o usuário não irá mudar o tamanho do form.

Depois é só uma questão de usar os layout managers e montar a tela.

Agora, pq vc não continua fazendo em vb.net mesmo?

ViniGodoy

Você tentou seguir o Quick Start Guide?

A

Então… nessa apostila pelo que entendi ele fala para adicionar o componente no grid… mas que componente é esse.

Eu estou querendo aprender Java porque hoje meus sistemas em vb.net só funciona em Windows e estou querendo me preparar pra outras plataformas Linux por exemplo. A não ser que vb.net já esteje funcionando em Linux e eu não estou sabendo.

D

alexpassos:
Então… nessa apostila pelo que entendi ele fala para adicionar o componente no grid… mas que componente é esse.

Eu estou querendo aprender Java porque hoje meus sistemas em vb.net só funciona em Windows e estou querendo me preparar pra outras plataformas Linux por exemplo. A não ser que vb.net já esteje funcionando em Linux e eu não estou sabendo.

Adcionar os componentes no grid, os botões, textbox e etc, vc adciona no grid e não no form direto.

Projeto Mono.
mas á enfase é o c# sobre vb não sei.

A

Mas que grid é esse… JFrame

ViniGodoy

Já ouviu falar do projeto Mono?
http://www.mono-project.com/

A

Esse Mono também já ouvi falar… mas fiquei sabendo que não é confiável ainda esta por não acompanhar as atualizações do FrameWork…

Essa Microsoft gosta de monopolizar tudo…rsrs sacangem

D

Vejamos se consigo explicar como funciona + - esses layout, pois tambem não tenho muita experiencia;
[na verdade tive mais problemas doque soluçoes com eles rsrs]

por padrão o seu JFrame vem sem layout (ou seja layout = null).
por isso se usa o setBounds, pra definir a posição exata do componente na tela.

É possivel usar alguns layouts para “Facilitar” esse processo e proporcionar o redimencionamento dos componentes no frame caso o frame em si seja rediemncionado, maximizado e etc.
alguns deles são:

-GridLayout
-FlowLayout
-BorderLayout dentre outros.

vamos usar como exemplo o border layout.
Inicialmente vc cria o seu frame, e depois cria um objeto do tipo layout, define ele como borderlayout e o adciona ao seu frame.
Isso fara com que seu frame agora seja dividido em 4 partes. norte, sul, leste e oeste.

a partir deste ponto vc passa a adicionar os seus componentes no seu borderlayout, que por sua vez esta adcionado no seu jframe.
e ao invés de usar o set bounds vc adciona um botão por exemplo na area norte do seu border layout.

se der posto uns trechos de codigo daqui a pouco.

espero ter ajudado, e me corrijam se eu tiver falado asneira.

see ya

Edit: acho que tem um objeto Panel no meio disso ai.

ViniGodoy

Se você usar para o .net 3.5, é bastante confiável sim. Eu faria um teste, pode ser muito mais rápido do que reescrever a aplicação toda.

Criado 17 de setembro de 2010
Ultima resposta 17 de set. de 2010
Respostas 24
Participantes 5