Limitar caracteres em um JTextField
Para limitar uma quantidade de caracteres em um JTextField não existe nenhuma propriedade como por exemplo um atributo maxlength do <input> HTML. Porém, graças a facilidade da API Java Swing é possível implementar um novo comportamento para a entrada de dados do seu componente.
A Classe JTextField possui um método de instância chamado setDocument() que recebe uma interface Document como parâmetro.
Para fazer nosso novo comportamento basta criar uma classe que implemente Document, mas para facilitar criaremos uma classe que estende de PlainDocument (classe que já implementa Document). Então sobrescreveremos o método insertString() que é responsável pela entrada de dados no componente.
2
3 import javax.swing.text.AttributeSet;
4 import javax.swing.text.BadLocationException;
5 import javax.swing.text.PlainDocument;
6
7 public class NovoDocumento extends PlainDocument {
8 @Override
9 public void insertString(int offset, String str, AttributeSet a) throws BadLocationException {
10 if (getLength() > 5)
11 return;
12 super.insertString(offset, str, a);
13 }
14 }
Implementando Observer com Swing
Um problema muito comum é o gerenciamento e comunicação entre janelas em uma aplicação Swing. Vou deixar aqui uma breve explicação de como resolver isso utilizando o padrão Observer que é facilmente aplicável utilizando as implementações prontas disponíveis na API Java.
O que é Observer?
O design pattern Observer permite que objetos sejam notificados sobre mudanças de estado de outro objeto sem possuir um forte acoplamento entre eles. O observado não conhece e nem deseja conhecer o observador, apenas envia notificações a ele avisando sobre possíveis mudanças.
Observer + MVC + Swing
Aproveitando o poder do Observer podemos montar uma arquitetura MVC simples onde a camada de Controle após solicitar os dados ao Modelo, envia para a camada da View os dados solicitados. O Controle no momento deste envio não sabe para onde está enviando os dados, e a View não sabe quem enviou a ela, mas ela sabe como receber esses dados e exibir da forma correta na tela.
Exemplo
Colocamos aqui 2 exemplos, a classe ClienteController e ClienteView. Veja a comunicação entre elas, a explicação está nos comentários lembrando que foi comentado apenas o que estamos mostrando nesse post.
ClienteView.java
2
3 import java.awt.Color;
4 import java.awt.Dimension;
5 import java.awt.FlowLayout;
6 import java.awt.event.ActionEvent;
7 import java.awt.event.ActionListener;
8 import java.util.Observable;
9 import java.util.Observer;
10
11 import javax.swing.JButton;
12 import javax.swing.JFrame;
13 import javax.swing.JPanel;
14 import javax.swing.JTextPane;
15
16 public class ClienteView extends JFrame implements Observer {
17 private JTextPane visor;
18 private JPanel painel;
19 private JButton botao;
20 // Atributo principal para nosso exemplo
21 private ClienteController controle;
22
23 public ClienteView() {
24 super(“Listagem de Clientes“);
25 setSize(200, 300);
26 setLocationRelativeTo(null);
27
28 painel = new JPanel(new FlowLayout());
29 visor = new JTextPane();
30 visor.setContentType(“text/html“);
31 visor.setBackground(Color.LIGHT_GRAY);
32 visor.setPreferredSize(new Dimension(200, 200));
33 botao = new JButton(“Solicitar listagem“);
34 botao.addActionListener(new AcaoBotao());
35 painel.add(visor);
36 painel.add(botao);
37 getContentPane().add(painel);
38
39 // Instancia o controle
40 controle = new ClienteController();
41 // Adiciona essa tela como observadora, a partir de agora qualquer mudança de estado no controle a tela será notificada
42 controle.addObserver(this);
43 }
44
45 public void init() {
46 setDefaultCloseOperation(EXIT_ON_CLOSE);
47 setVisible(true);
48 }
49
50 // Innerclass responsável pela ação do botão
51 private class AcaoBotao implements ActionListener {
52 public void actionPerformed(ActionEvent e) {
53 controle.solicitarCliente(); // Executando uma ação no controle
54 }
55 }
56
57 @Override
58 public void update(Observable arg, Object arg1) {
59 // Quando este método for chamado, é porque houve mudanças no objeto que estava sendo observado (o controle)
60 // arg1: trará informações opcionais do que foi alterado ou solicitado
61 // detalhe: a view não precisa saber quem enviou os dados, mas tem certeza de que eles vieram
62 visor.setText((String) arg1); // mostrando na tela as informações enviadas pelo controle
63 }
64
65 public static void main(String[] args) {
66 new ClienteView().init();
67 }
68 }
69
2
3 import java.util.Observable;
4
5 public class ClienteController extends Observable {
6 public void solicitarCliente() {
7 // Aqui você faria uma solicitação de dados para um DAO por exemplo
8 // mas como isso é apenas um exemplo, estou criando os dados aqui mesmo
9 String dados = “Danilo <br> Roberto <br> Oscar“;
10 // Avisa a todos seus “observadores” que houve mudança de estado
11 setChanged();
12 // Envia dados aos “observadores” (quem está observando chamará o método update() implicitamente)
13 // detalhe: o controle não sabe para onde está enviando os dados
14 notifyObservers(dados);
15 }
16 }
Conectando no Excel via (ODBC)
Acessar informações de arquivos Excel(*.xls) no Java é muito fácil e simples, isso é possível devido ao uso de drivers ODBC e o único requisito necessário é ter o Microsoft Office Excel instalado. Uma das vantagens dessa conexão é poder fazer o uso de instruções SQL, como por exemplo um SELECT, comando utilizado largamente em banco de dados convencionais.
Primeiramente crie o arquivo Excel seguindo a estrutura abaixo:
Observe que a primeira linha da planilha está reservada para servir como colunas de uma tabela, já o nome da planilha (não do arquivo) se comportará como uma tabela lembrando que estes valores serão utilizados na cláusula SELECT.
Os registros estão a partir da segunda linha da planilha.
Abaixo um exemplo de consulta simples em um arquivo do Excel:
2 import java.sql.Connection;
3 import java.sql.DriverManager;
4 import java.sql.ResultSet;
5 import java.sql.Statement;
6
7 public class ConexaoExcel {
8 public static void main(String args[]) {
9 Connection con = null;
10 Statement stm = null;
11 ResultSet rs = null;
12
13 try {
14 Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“);
15 con = DriverManager.getConnection(“jdbc:odbc:Arquivos do Excel;DBQ=c:/arquivo.xls“);
16
17 stm = con.createStatement();
18 rs = stm.executeQuery(“SELECT * FROM [dados$]“);
19
20 while (rs.next()) {
21 System.out.println(rs.getString(“nome“) + “ “ + rs.getString(“idade“));
22 }
23
24 rs.close();
25 stm.close();
26 con.close();
27 }
28 catch (Exception e) {
29 e.printStackTrace();
30 }
31 }
32 }
Veja que na string de conexão há um argumento DBQ, seu valor indica o caminho onde o arquivo se encontra.
Muito importante lembrar que ao tentar fazer a leitura de dados deste arquivo o mesmo não pode estar aberto. Repare também que na consulta SQL o nome da tabela está entre colchetes e o nome terminado por $, se por acaso a instrução não conter esses detalhes será gerado um erro na leitura dos dados.
