quarta-feira, 9 de julho de 2014

Focus no JInternalFrame

E quando eu penso que, não terei de mexer mais com algum projeto em Swing, me engano e lá vamos nós...

Nesse projeto que estava desenvolvendo, estava usando JInternalFrame para confecção de telas. Quando uma tela era aberta, eu queria que ela fosse aberta com o focus. Depois de muito pesquisar, achei a solução na própria documentação.

Segue solução para o problema:

protected void createFrame() {
    MyInternalFrame frame = new MyInternalFrame();
    frame.setVisible(true);
    desktop.add(frame);
    try {
        frame.setSelected(true);
    } catch (java.beans.PropertyVetoException e) {}
}

Também descrevo abaixo algumas boas práticas no uso de JInternalFrame, retiradas da documentação da API.

Rules of Using Internal Frames

If you have built any programs using JFrame and the other Swing components, then you already know a lot about how to use internal frames. The following list summarizes the rules for using internal frames. For additional information, see How to Make Frames and The JComponent Class.
You must set the size of the internal frame.
If you do not set the size of the internal frame, it will have zero size and thus never be visible. You can set the size using one of the following methods: setSizepack, orsetBounds.
As a rule, you should set the location of the internal frame.
If you do not set the location of the internal frame, it will come up at 0,0 (the upper left of its container). You can use the setLocation or setBounds method to specify the upper left point of the internal frame, relative to its container.
To add components to an internal frame, you add them to the internal frame's content pane.
This is exactly like the JFrame situation. See Adding Components to the Content Pane for details.
Dialogs that are internal frames should be implemented using JOptionPane or JInternalFrame, not JDialog.
To create a simple dialog, you can use the JOptionPane showInternalXxxDialog methods, as described in How to Make Dialogs.
You must add an internal frame to a container.
If you do not add the internal frame to a container (usually a JDesktopPane), the internal frame will not appear.
You need to call show or setVisible on internal frames.
Internal frames are invisible by default. You must invoke setVisible(true) or show() to make them visible.
Internal frames fire internal frame events, not window events.
Handling internal frame events is almost identical to handling window events. See How to Write an Internal Frame Listener for more information.
Se alguém precisar de alguma ajuda no inglês, deixe um comentário, que eu dou uma forçinha.

Referência:
http://docs.oracle.com/javase/tutorial/uiswing/components/internalframe.html
Leia Mais ››

quarta-feira, 21 de maio de 2014

Passar lista de string como datasource - ireport

Olá amigos,

esse post aqui será bem breve. Vamos supor que temos um relatório no ireport (independente da versão) com o seguinte layout:


Note, que na listagem de carros só existem seus respectivos nomes e o texto do título do estático. A paginação realizada foi feita usando variável nativa do ireport. Neste exemplo, não será necessário construir uma lista de objetos Carro ou Automovel para exibir os carros no relatório, basta somente criar uma lista de strings e adicionar os nomes dos carros nela. Porém, agora um problema surge. Como fazemos para que o jasperreport itere esse lista, já que ele espera que um Field ($F), sendo esse o dado que está dentro de cada posição da lista ?

A resposta é simples !! Depois de muito pesquisar, achei no link abaixo a solução.

http://www.guj.com.br/java/240613-array-de-string-no-ireport-resolvido

Para iterar uma lista de objetos simples (String, Integer, Long, etc.) que, foi passada como datasource, basta somente criar um Field com o nome de _THIS, tendo o tipo o mesmo do objeto. Exemplo:

Se temos uma lista de Integer, criamos o Field _THIS do tipo Integer
Se temos uma lista de String, criamos o Field _THIS do tipo String

Depois de ter criado o Field, clique e arraste-o para a banda detail e pronto, é só compilar e executar seu relatório que, os dados aparecerão iterados.
Leia Mais ››

domingo, 13 de abril de 2014

Diferença entre alt e title

Olá galera,

hoje teremos um post pequeno, explicando algo simples mas, que causa geralmente certa confusão.

Qual a diferença entre o atributo alt e title ?

Isso causa certa confusão por causa de nosso amigo IE que, em sua versão 7 e anteriores, exibia o que tinha sido especificado no valor do atributo alt, como uma tooltip. Este comportamento está errado visto que, o atributo alt representa o valor exibido caso uma imagem não seja carregada. Exemplo:

Tento carregar a imagem logo1.jpg

<img src="logo1.jpg" />

Porém, ela não existe. Se tivéssemos especificado um valor no atributo alt, o valor ali especificado seria exibido.

<img src="logo1.jpg" alt="Sei que a imagem não existe" />

O atributo title funciona como uma tooltip, um texto explicativo. Para visualizar a tooltip, basta parar o mouse em cima do elemento HTML.

Referências:
http://www.w3schools.com/tags/att_img_alt.asp
Leia Mais ››

quarta-feira, 26 de fevereiro de 2014

Intervalos de datas para coluna do tipo YEAR no MySQL

Olá amigos leitores (se é que alguém lê o que posto)

Estou desenvolvendo uma aplicação que faz um insert em uma coluna do tipo YEAR de uma tabela MySQL. Minha aplicação está correta mas, as vezes notava que para algumas datas o seguinte erro acontecia:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'ano' at row 1
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4118)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)

Quando me deparei com esse erro pela primeira vez, fiquei assustado pois, pensei que era algum erro na lógica do meu negócio. Revisei tudo e nada. Então, procurando no google, achei o link abaixo da documentação do MySQL.

http://ftp.nchu.edu.tw/MySQL/doc/refman/4.1/pt/year.html

Não existe nada melhor que a documentação da tecnologia. Logo no início da documentação, está escrito que para o tipo YEAR só são aceitos anos de 1901 - 2155. Logo, descobri a causa dos meus problemas.

Trecho da documentação:
Como um número de 4 dígitos na faixa de 1901 até 2155.

Bem amigos e amigas, espero ter ajudado. Qualquer erro ou melhoria, comentem.
Leia Mais ››

terça-feira, 12 de novembro de 2013

Último elemento de lista JSTL

Se você está em um loop c:forEach e, quer exibir ou carregar alguma coisa quando o loop estiver no último elemento, você pode usar o método getLast() do contador (varStatus) do loop.

Contador de loop c:forEach ??

Sim, a tag c:forEach nos permite criar um contador, que é nada mais que uma variável de escopo de página. Essa variável é criada a partir da especificação do atributo varStatus da tag c:forEach. Abaixo, segue um exemplo.

Exemplo 1.
<c:forEach items="${suaLista}" var="elemento" varStatus="contador">
          ${elemento.id} - ${elemento.nome} - ${elemento.email}
</c:forEach>


Para quem não entendeu o exemplo acima, mostro abaixo o trecho de código correspondente em java.

Exemplo 2
for(int i=0; i<suaLista.size(); i++){
          Object o = suaLista.get(i);
          System.out.println(o.getId() + " - " + o.getNome() + " - " + o.getEmail());
}

Se você não entendeu o exemplo acima, fico triste em te dizer que seu problema é lógica de programação. Porém, se você entendeu, vamos a uma explicação mais profunda. Na tag c:forEach o controle do loop, a criação do objeto do laço e a incrementação são automáticos. Logo, você não tem que se preocupar com isso, você só tem que se preocupar com a lógica do seu negócio.

Mas, aonde entra o contador / varStatus ????

Calma, já vamos chegar lá. Usando o exemplo 1, vamos supor que, além dos dados da lista você também quer exibir a posição da lista aonde estão aqueles dados.

Exemplo 3.
<c:forEach items="${suaLista}" var="elemento" varStatus="contador">
          ${contador.count}: ${elemento.id} - ${elemento.nome} - ${elemento.email}
</c:forEach>

O resultado desse exemplo será:

0: 1 - João - jp@gmail.com
1: 2 - Maria - maria@gmail.com
2: 3 - José - ze@gmail.com

Que count é esse ???

Esse count é um método da interface LoopTagStatus, que é acessado via reflection, logo você não precisa usar getCount() e, sim count. Esse método retorna o valor atual do contador. Dessa forma, podemos atingir o resultado acima.

Hummm, entendi o count. Mas, como uso o last ?

Você pode usar o método last da forma que quiser. Ele funciona via reflection, como o count. Segundo a documentação, ele funciona da seguinte forma:

Returns information about whether the current round of the iteration is the last one. As with isFirst(), subsetting is taken into account. isLast() doesn't necessarily refer to the status of the underlying Iterator; it refers to whether or not the current round will be the final round of iteration for the tag associated with this LoopTagStatus.

Ele retorna um booleano informando se aquela iteração é última ou não. Se for a última é porque corresponde ao último elemento do loop, senão, é porque não corresponde.

Agora que já sabemos como o last funciona, podemos ver um exemplo dele. Vamos supor que listagem de objetos do exemplo 3, no último objeto queremos uma label com a seguinte descrição "Sou o último". Segue exemplo.

Exemplo 4.
<c:forEach items="${suaLista}" var="elemento" varStatus="contador">
          ${contador.count}: ${elemento.id} - ${elemento.nome} - ${elemento.email}
          <c:if test="contador.last">
                 Sou o último.
          </c:if>
</c:forEach>

O resultado será.

0: 1 - João - jp@gmail.com
1: 2 - Maria - maria@gmail.com
2: 3 - José - ze@gmail.com Sou o último.

Galera, espero que tenham gostado de mais esse post. Se escrevi algo errado, comentem, para que eu possa consertar.

Referências:
http://stackoverflow.com/questions/3099234/jstl-foreach-omit-an-element-in-last-record
http://docs.oracle.com/javaee/5/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html#isLast%28%29



Leia Mais ››

segunda-feira, 4 de novembro de 2013

Como retirar tags html de uma string - retirar html string java

Olá amigos !!

Um dia estava precisando fazer um programa que retirava tags html de uma string que vinha do banco de dados. Pensei como iria fazer aquilo. Então, comecei a pesquisar por soluções e vi algumas pessoas criando longas classes Java e scripts em Javascript para algo simples.

Cheguei a ver uma classe aonde foram registradas várias tags de html conhecidas e, depois ela checava palavra por palavra da string com as tags registradas e, retirava se achasse. Não achei aquilo muito correto pois, amanhã se fosse inventado uma nova tag, o programa não poderia ser mais aplicado.

Em um blog, vi que um leitor deu uma sugestão de uma regex para tal tarefa. Então, fui em cima disso e, consegui construir as seguintes soluções:

Regex em Java: <.*>

Regex em Javascript: <*>

Porém, existem prós e contras dessas soluções.

Prós:
- Consegue identificar qualquer tag html, visto que qualquer uma começa com < e termina com >.
- Não precisarei mais alterar esse programa.

Contra:
- Se na minha string houver algo que não seja html mas, que comece com < e termine >, o programa irá identificar isso como html e, irá retirar.

Explicação:

Se vocês notarem, em js não existe o ponto (.) e, em java existe. Essa diferença existe pelo fato de, em javascript o caractere asterisco (*) significa qualquer caractere (número ou letra) em uma quantidade de 0 a infinito. Em Java, o * significa somente que algo vai se repetir em um quantidade de 0 a infinito. Para dizermos que queremos que a regex encontre 0 ou infinitos caracteres, precisamos usar o ponto (.), onde, o mesmo significa  um caractere qualquer.
Leia Mais ››

sexta-feira, 6 de setembro de 2013

Roteiro de estudo para o livro EJB 3 Profisional - Java Persistence API

Olá mais uma vez. Há um tempo comprei o livro

e resolvi estudá-lo. Terminado meu estudo, achei interessante disponibilizar um guia para pessoas que tem esse livro ou, querem comprá-lo mas, não sabem o que ler dele, caso queriam aprender JPA.

Estudei os seguinte capítulos e tópicos:

Capítulo 1 - todo
Capítulo 2 - todo
Capítulo 4 - todo
Capítulo 6 - só estudei o tópico "Definindo Queries Nomeadas", página 197
Capítulo 8 - todo
Capítulo 9 - só estudei por completo os tópicos "Lock" e "Geração de esquema" respectivamente, página 330 e 342.

Mais uma vez, espero ter ajudado a todos.
Leia Mais ››