quinta-feira, 15 de janeiro de 2009

Fabrica de sessoes do hibernate

Me deparei com um problema de como alterar a configuração do hibernate em run, pois o usuário terá a opção de escolher o caminho de instalação do software. Para resolver isso utilizei o arquivo hibernate.cfg.xml somente configuro o path do arquivo do banco de dados em run time. Segue a classe que criei, a fabrica de sessões do hibernate:

public class HibernateUtil {
private static final AnnotationConfiguration cfg =
new AnnotationConfiguration();
private static Session session;

static {
try {
cfg.configure("hibernate.cfg.xml");
File arquiv = new File(cfg.getProperty("nome.banco"));
cfg.setProperty("hibernate.connection.url","jdbc:firebirdsql:localhost/3050:"+arquiv.getAbsolutePath());
session = cfg.buildSessionFactory().openSession();
} catch (Throwable ex) {
System.out.println(ex.getMessage());
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}

public static Session getSession(){

if (session == null) {
try {
cfg.configure("hibernate.cfg.xml");
File arquiv = new File(cfg.getProperty("nome.banco"));
cfg.setProperty("hibernate.connection.url","jdbc:firebirdsql:localhost/3050:"+arquiv.getAbsolutePath());
session = cfg.buildSessionFactory().openSession();
}
catch (Exception e) {
System.err.println("Initial SessionFactory creation failed." + e);
throw new ExceptionInInitializerError(e);
}

}
return session;
}
}

Opções da jTable

Vou colocar algumas opções importantes da jTable.
Vamos começar com a largura das células, pra terminar com os ... no final das strings, pelo menos da maioria, pois caso a string seja grande mesmo, com múltiplas linhas, seria necessário a utilização de html ou implementar um jTextArea. Essa linha simplesmente possibilita a alteração da largura da coluna:

jTable1.getColumnModel().getColumn(n).setPreferredWidth(m);

n = coluna da tabela ‘inicia em 0 ’;
m = largura em px da coluna;

Também podemos configurar a altura das linhas da tabela:

jTable1.setRowHeight(m);

m= altura em px das linhas;

Outra opção importante é a reordenação das colunas, caso você tenha implementado um renderer e no mesmo você utilizou a variável column a reordenação feita pelo usuário se tornaria um problema. Podemos bloquear a reordenação das colunas:

jTable1.getTableHeader().setReorderingAllowed(false);


Também podemos bloquear a alteração da largura das colunas:

jTable1.getTableHeader().setResizingAllowed(false);

quinta-feira, 8 de janeiro de 2009

Utilizando jxTable do swingx



Após instalar os componentes do swingx fiz alguns testes, e fiquei quebrando a cabeça na utilização do jxTaskpane e jxTable.

São componentes visuais muito legais e que já facilitam um pouco a vida do programador.

Criei uma classe modeloTabUsuario que extendia AbstractTableModel, o problema que mais demorei pra resolver foi uma falha de digitação no método que sobrescrevia getColumnName, pois os nomes das colunas da minha jxtable ficava com as letras do alfabeto. Segue a classe de teste criada por mim:



public class modeloTabUsuario extends AbstractTableModel{

private ArrayList datalist = new ArrayList();

private String[] columns = {"Nome","Login","Tipo"};

public modeloTabUsuario(Collection l){

datalist.addAll(l);

}

public modeloTabUsuario(){

}

public void addUsuarios(Usuarios usu){

datalist.add(usu);

fireTableDataChanged();

}

public void addListUsuarios(Collection list){

datalist.addAll(list);

fireTableDataChanged();

}

public Usuarios getUsuario(int rows){

if (getRowCount() >= rows ){

return (Usuarios) datalist.get(rows);

}else return null;

}

@Override

public String getColumnName(int col){

return columns[col];

}

public String[] getColumns(){

return columns;

}

@Override

public Class getColumnClass(int c) {

return getValueAt(0, c).getClass();

}

public int getRowCount() {

return datalist.size();

}

public int getColumnCount() {

return columns.length;

}

public Object getValueAt(int rowIndex, int columnIndex) {

Usuarios usu = getUsuario(rowIndex);

switch (columnIndex) {

case 0:

return usu.getNome();

case 1:

return usu.getLogin();

case 2:

int tp = usu.getTipo();

if(tp == 0){

return new String("Restrito");

}

if(tp == 1){

return new String("Normal");

}

if(tp == 2){

return new String("Supervisor");

}

if(tp == 3){

return new String("Empresa");

}

default:

return null;

}

}

}

Nos testes ate agora tudo certo com o swingx, acredito que irei utilizar o mesmo nas minhas aplicações futuras.