Gostaria de saber se alguém sabe como limitar o comprimento do String dentro de JTextField, so que o mesmo está Binding (vinculado) a uma propriedade de um objeto?
Eu até desenvolvi uma classe que implementa o Document para fazer isso, só que quando o Bean Binding é inicializado, ele substitui o meu Document.
muito obrigado, não tinha reparado que tinha listeners no Document.
grato e desculpe qualquer coisa
T
tebosoftware
Tentei montar o travamento no evento insertUpdate do listenner DocumentListener, só que não deu muito certo não pois ele nao tem retorno de validação e tb não funciona com exception.
descobri que a classe que o beanbinding altera tb é o DocumentFilter com a classe JTextComponentAdapterProvider
aff… vou ter que estudar mais um pouco e terei q alterar essa classe tb…
aff
rs
M
Marky.Vasconcelos
Nossa… mas continue com os estudos que no final voce consegue.
T
tebosoftware
Mark
estive estudando o componente BeansBinding e ele tem uma classe que valida os dados que são inseridos, e tem tb um listener para que possa ser feito alguma coisa.
no meu caso no validator, coloquei para retornar um erro quando for superior a quantidade de caracteres, utilizando a classe Result do BeansBinding.
e Adicionei um listener e no evento de falha de sincronismo eu mostro uma mensagem.
A validação funciona pois não altera o Bean que estou vigiando, so que visualmente não funciona pois o JTextField ainda continua exibindo os caracteres que passaram do limite.
vc ja trabalhou com o BeansBindig?
Se não trabalhar, como vc faz a vinculação dos componentes swing com os beans?
grato
M
Marky.Vasconcelos
Então… no meio dos meus projetos eu acho que reinventei varias rodas então eu uso um objeto que eu mesmo criei…
Chamo de ComponentBind passo JTextComponents e FieldResovers para ele e quando for atualizer o objeto eu faço
binder.updateObject(objectDoTipo);
E para atualizar a view chamo o método assim:
binder.updateView(objectDoTipo);
T
tebosoftware
Você utiliza então uma idéia de MVC ou MVP?
M
Marky.Vasconcelos
Sinceramente não sei xD
Eu separo assim:
model > models
dao > DAO generica e conexao com banco
view > Swing
Eu ligo o model com a view atraves do Binder que criei
E uso a dao para mandar pro banco.
Eu acho que é MVC.
Eu não estudei MVC e MVP.
T
tebosoftware
Em que momento vc faz a validação dos dados?
M
Marky.Vasconcelos
Então… é que todos os campos Strings no meu bd estão como varchar<255> então não me preocupo com o tamanho, os campos ints e doubles são convertidos pelo binder e caso tenha algo errado (Por exemplo letras) ele lança uma Exception que eu posso tratar para validação.
E tem outra coisa meu Binder não mantem sincronizado os dois… apenas quando chamo os métodos para atualizar ou a view com o objeto ou o objeto com a view eu sei os valores.
T
tebosoftware
Eu quis dizer em relação a validação de valores, como se um campo de percentual aceita uma determinada faixa, etc
M
Marky.Vasconcelos
Todos meus campos não tem essas exigencias… mas de qualquer modo no conversor do binder seria possivel de colocar isso… por que ao converer o valor poderia lançar uma Exception.
T
tebosoftware
Acho q não está me entendendo
quando um campo exige um determinado valor tipo, quantidade não pode ser inferior a 1, essa validação vc faz no view, ou vc faz no model?
M
Marky.Vasconcelos
Então… voce que não me entendeu
No meu binder eu tenho a opção de passar um formatter meu que a interface é a seguinte
public interface Formatter{
public Object parseString(String arg1);
public String format(Object obj1);
}
Caso o método retorne uma Exception eu lanço ela ao método que chamou o update do binder.
Tipo assim:
FormattervalorMaiorQueUm=newFormatter(){@OverridepublicStringformat(Objectobj1){returnInteger.toString((Integer)obj1);//Eu sei que nessa coluna ele retorna sempre Integers}@OverridepublicObjectparseString(Stringarg1){intobj;try{obj=Integer.parseInt(arg1);}catch(Exceptione){thrownewRuntimeException(arg1+": Este valor não é um numero inteiro valido");}if(obj<1)thrownewRuntimeException(arg1+": O valor não pode ser menor que um");returnobj;}}
T
tebosoftware
O problema que eu encontro nesta abordagem é que o usuários só vai saber que deu erro quando é feito a transferência de dados, depois que ele já preencheu toda a tela.
M
Marky.Vasconcelos
É… eu sei disso…
Mas mes campos não precisam de validação desse tipo, apenas para converter para numeros alguns valores.
Mas pretendo fazer algo para validar mesmo, tava pensando nisso a um tempo.
M
Marky.Vasconcelos
E eu não sei se é tão ruim assim quando o usuario processa os dados aparece um campo em vermelho pois está com algo errado.
T
tebosoftware
Bom num sistema baseado na web, geralmente a validação é feita somente no retorno, mas numa aplicação desktop, acredito que o usuário tenha que saber antes pois ele, em geral, espera mais agilidade numa aplicação desktop.
M
Marky.Vasconcelos
E o engraçado é que tenho um sistema na web para um cliente com JSF e a validação é na hora.
=/
Mas eu pretendo implementar algo em breve com essa finalidade para meus sistema desktop.
T
tebosoftware
Bom eu estou estudando o beansbinding e com ele posso colocar validators, que impedem que seja colocado um valor inválido, e tb coloquei um extended by org.jdesktop.beansbinding.AbstractBindingListener no metodo syncFailed e nele eu faço o bind efetuar um refresh ai ele restaura o último valor válido. E parece que ficou legal.
Vou testar mais e ver se existe outras maneiras.
falow
R
root_
EStou com o mesmo problema que vc tebosoftware, criei uma classe bacaninha extendendo o document… onde passo por parametros a quantidade de caracteres que o textField vai aceitar, se é tudo Upper ou Lower e se é alfanuméricou ou numérico.
O problema é quando uso binding no textField… pois perde toda formatação do document que eu havia criado…
Você já conseguiu uma solução razoável para isso???