Erro com uso de JProgressBar

2 respostas
cleiton_herrmann

Olá a todos !!!

Há algum tempo tenho convivido com a excessao mencionada abaixo, ela nao causa nenhum funcionamento anormal no sistema, (pelo menos q eu tenha percebido), mas ja ta me encomodando…
Vou explicar o que eu tenho:
eu criei um “componente” pra usar como rodapé das telas, esse componente é na verdade um JPanel, com 3 JLabels e um JProgressBar, nessa classe que extends JPanel existe dentre outros, um metodo que uso pra trabalhar com o progressbar (setar a propriedade indeterminate)

public void setIndeterminateProgressBar(boolean indeterminate) { jProgressBar1.setIndeterminate(indeterminate); }
entao eu declaro um objeto na tela e quando vou fazer alguma operação meio demorada, eu faço ao inicio e término da operação:

objeto.setIndeterminateProgressBar(true); objeto.setIndeterminateProgressBar(false);
eu chamo esses métodos a partir de Threads, pra que a tela possa ser atualizada e o progresso do JProgressBar exibido para o usuario, e acredito que o problema esteja ai…
a excessao é a seguinte:

<blockquote>Exception occurred during event dispatching:

java.lang.NullPointerException

at javax.swing.plaf.basic.BasicProgressBarUI.updateSizes(BasicProgressBarUI.java:470)

at javax.swing.plaf.basic.BasicProgressBarUI.getBox(BasicProgressBarUI.java:427)

at javax.swing.plaf.basic.BasicProgressBarUI.paintIndeterminate(BasicProgressBarUI.java:582)

at javax.swing.plaf.metal.MetalProgressBarUI.paintIndeterminate(MetalProgressBarUI.java:126)

at javax.swing.plaf.basic.BasicProgressBarUI.paint(BasicProgressBarUI.java:392)

at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)

at javax.swing.JComponent.paintComponent(JComponent.java:763)

at javax.swing.JComponent.paint(JComponent.java:1027)

at javax.swing.JComponent.paintToOffscreen(JComponent.java:5122)

at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:285)

at javax.swing.RepaintManager.paint(RepaintManager.java:1198 )

at javax.swing.JComponent._paintImmediately(JComponent.java:5070)

at javax.swing.JComponent.paintImmediately(JComponent.java:4880)

at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:783)

at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)

at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)

at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128 )

at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:284)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178 )

at java.awt.Dialog$1.run(Dialog.java:1046)

at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:284)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)</blockquote>

esses dias eu tava pesquisando a respeito dessa excessao, e encontrei tres links, mas nao consegui entender, entao venho pedir a ajuda de vcs…
1 - http://bannister.us/weblog/2008/02/
2 - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4914265
3 - http://forums.sun.com/thread.jspa?threadID=5339057&tstart=0

no terceiro link e quarto post do tópico, o cara explica que o que está acontecendo é que nao é recebido a seqüência de eventos que permite que o código execute mesmo quando componentInnards é nulo, e que componentInnards só é definida para nulo em um lugar - no método cleanUpIndeterminateValues(). Este método é chamado pela propriedade ouvinte quando a propriedade indeterminate da barra de progresso é definida para false. Então você não deve ter uma situação em que o valor é nulo e a barra de progresso é indeterminada(indeterminate = true eu acho, rsrsrs).

E que o que pode estar errado é:

  • Você está alterando a propriedade indeterminate da barra de progresso fora do awt event thread.
  • você sobrecarregada JProgressBar.isIndeterminate() em uma subclasse de devolver valores inconsistentes ou não notificar a propriedade ouvintes

Enfim, eu nao entendi muito bem isso tudo…
O que vem a ser componentInnards ???
Como assim sobrecarrega isIndeterminate() ???

Desculpe minha tradução, eu sei q ela nao é das melhores…

vlw t+

2 Respostas

T

O que você deve fazer é executar “setIndeterminate” na mesma thread do Swing, com SwingUtilities.invokeLater. Isso normalmente é feito assim:

public void setIndeterminateProgressBar (final boolean indeterminate) {
    SwingUtilities.invokeLater (new Runnable() {
        public void run () {
            jProgressBar1.setIndeterminate (indeterminate); 
        }
    });
}
cleiton_herrmann

puts, eu quase acertei, rsrsrs

eu tinha tentado fazer:

SwingUtilities.invokeLater (new AtualizarTabelaParcelas());

onde “new AtualizarTabelaParcelas()” é a classe que implementa “Runnable” que vai chamar o método “setIndeterminateProgressBar (boolean indeterminate)”

no lugar de:

Thread t = new Thread(new AtualizarTabelaParcelas()); t.start();

mas o correto é usar o SwingUtilities no método que vai chamar setIndeterminate(indeterminate), no caso o “setIndeterminateProgressBar (final boolean indeterminate)” como vc falou…
Eu acho que resolveu o problema, a excessao era lançada só de vez enquando, mas eu rodei o programa 15 vezes agora e a excessao nao foi lançada…

vlw thingol, muito obrigado !!!

Criado 13 de janeiro de 2009
Ultima resposta 14 de jan. de 2009
Respostas 2
Participantes 2