Carregamento do JFrame-URGENTE-AVANÇADO!

10 respostas
M

Boa tarde a todos.

Meu problema é o seguinte. Tenho um JFRame que instancia varias classes e insere as insere nele.
Uma dessas classes usa métodos native para acessar umA dll criada que por sua vez acessa um banco.

O que acontece é o seguinte:
Enquanto os objetos que não usam metodos native são instanciados, o JFrame está ok. A partir do primeito método native, o JFrame fica estranho. O cursor muda caso eu encoste do canto do JFRame, se eu minimizar ou colocar qualquer janela do windows na frente do JFrame, o JFrame só se repinta depois que este objeto que usa métodos native terminar de carregar. Isto tudo só acontece quando a linha que chama o método native é interpretada.
Pensei em fazer a carga em um painel e, depois que todos os objetos estejam carregados, colocar este painel na tela. Só que este componente que usa métodos native é um canvas que precisa ser pintado de acordo com informações do banco. Enquando eu não coloco ele no JFrame, ele não se pinta. Nem que eu explicitamente chame o método repaint().
Ele só entra no Paint(Graphics g) se o canvas estiver no JFrame. Só que aí acontece o que eu já citei.

Muito confuso??? qualquer dúvida é só me perguntar…

Não sei mais o que fazer…

qualquer ajuda será bem vinda.

Muito obrigado.

10 Respostas

T

Olá, Mário…

Será que essa DLL que você está usando não está fazendo algo diferente do que você gostaria?

Não sei se entendi direito, mas uma forma de você tentar solucionar isso seria você rever suas classes, fazer esse método chamar a DLL para executar o acesso aos dados do jeito que você quer, aguardar um retorno destes dados e a partir daí você instanciar seu JFrame… Enquanto os dados são carregados ou consultados, você apresenta ao usuário um JStatusBar ou algo similar, para que o usuário não tenha a impressão que o sistema trava…
Ou então coloque essa classe que chama a DLL numa thread à parte…

Ajudei? Se não, coloque mais informações para que possamos colaborar melhor…!

Falou!

M

è mais ou menos isso sim…

tenho um canvas, e este canvas acessa a dll que retorna para ele o que ele deve pintar. Durante o acesso à dll, eu perco o controle sobre a aplicação.
Sabe quando vc coloca um disquete que esta com problema,e o windows fica tentando ler e não consegue, e parece que o sitema travou. É exatamente assim que a aplicação fica. Durante o tempo em que o método que acessa a dll esta executando, a aplicação para de responder, e só volta ao normal depois do término deste método.

Ficou mais claro???

valeu

T

Sei que é besteira perguntar, mas isso faz parte do padrão: não tem nenhum erro de lógica em seu código?

Fica difícil mandar o código? Se quiser, pode passar os fontes para meu e-mail: [email removido]

anjomal

O seguinte amigo, quando vc chama o metodo da DLL ate que este termina ele não entrega o controle da aplicação ao seu sistema, por isso vc fica sem controle … vc tem de colocar esse metodo JNI em outra thread, para vc nao perder o controle da aplicação durante o processamento do metodo nativo. ou fazer com que seu metodo nativo chame uma função de dentro da GUI passando para ela um percentual de progresso. leia corretamente a documentação JNI pois esta havendo um erro de logica dentro do seu codigo nativo.

falow !!!

M

esta acontecendo exatamente como o anjomal mencionou. onde deveria criar a Thread??? A minha aplicação deverá ser uma Thread??? ou apenas o método???

Não entendo muito de Thread. Vou tentar ler algo sobre isso…

Desde já eu agradeço…

Pelo menos agora entendi um pouco melhor o que está acontecendo.

Infelizmente a empresa onde trabalho (Funcate - São José dos Campos) não me autorizou a enviar o código. Desculpe.

caso alguém tenha alguma outra idéia, me avise por favor.

Por enquanto, vou tentar a sugestão do anjomal.

Só não entendi porque todos estão perguntando sobre erro de lógica.
Tá tudo funcionando ok. Só que o aplicativo não responde a nada enquanto o método nativo estiver sendo processado.

Obrigado, novamente…

M

Tentei o uso de Thread, mas não deu certo. Acho que to fazendo algo errado

???

Só queria ter o controle de minha aplicação durante o processo de um método nativo…

Obrigado

anjomal

Me responda uma pergunta essa função NATIVA esta desenhando algo na tela ? pois se estiver ela pode estar atrapalhando os threads do swing, vc nao poderia ilustrar com um codigo de exemplo oque vc esta fazendo ? para poder ajudar melhor.

falow

M

É no mínimo diferente a forma de fazer acesso ao banco. Até eu acho isso. Mas, deixa prá lá.

Existe uma dll que foi criada pelo Inpe que contém vários métodos. Então, usando native, eu acesso os métodos desta dll e pronto. Internamente, a dll acessa um banco access e me retorna coordenadas de linhas, pontos e polígonos. No caso de linhas são centenas, talvez milhares.
Com essas coordenadas na mão, eu uso o canvas para desenha-las.

Ficou mais claro???

Durante o processamento do método native, eu perco controle sobre a aplicação. Então, caso eu passe o mouse pelo canto do frame ou saia do Frame, o cursor deixa de ser a ampulhetinha por exemplo, e na minha opinião, acho que a aplicação, por estar esperando o native ser processado, nem notou que o mouse mudou.

Valeu mesmo por estar tentando me ajudar.

Brigadão.

anjomal

Esse e o problema o metodo native não terminou e como vc esta desenhando no canvas vc simplismente sua aplicação trava os threads do swing, bom a solução seria a seguinte pegar esses resultados do metodo native e colocalos num hastable ou collection para depois desenha-los na tela.

falow

T

Olá, Mário…

vem cá, esse método mostra algum status de carregamento destes dados? Se mostrar, uma idéia para que o sistema demonstre ao usuário qe está em processamento, seria você usar um componente que apresente qual o percentual de carga destes dados.

Criado 11 de abril de 2003
Ultima resposta 17 de abr. de 2003
Respostas 10
Participantes 3