tecgraf.javautils.gui
Class SwingThreadDispatcher

java.lang.Object
  extended by tecgraf.javautils.gui.SwingThreadDispatcher

public class SwingThreadDispatcher
extends Object

Classe que processa as chamadas que precisam ser executadas na thread (EDT) do Swing e contorna o erro introduzido pela Oracle no update25 do Java7. O erro está registrado em: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8019274 O cenário onde ocorre o erro é o seguinte:

A solução utiliza uma thread auxiliar para delegar as chamadas para o SwingUtilities e, portanto, permite que as chamadas através de uma thread RMI não lançem a exceção NPE no AppContext nas aplicações iniciadas com o JavaWebStart. As chamadas aos métodos SwingUtilities.invokeLater, SwingUtilities.isEventDispatchThread e SwingUtilities.invokeAndWait podem ser substituídas por chamadas aos métodos correspondentes nessa classe, que possuem a mesma API. O uso da solução de contorno requer que a aplicação faça um init da classe SwingThreadDispatcher. Caso não seja inicializada, o comportamento da aplicação que usa essa classe utilitária é igual ao comportamento corrente, ou seja, as chamadas são delegadas diretamente para os métodos da SwingUtilities e, portanto, lançam a exceção nos cenários de ocorrência do bug.

Author:
Tecgraf PUC-Rio

Constructor Summary
SwingThreadDispatcher()
           
 
Method Summary
static void init()
          Inicialização do executor para processamento das chamadas ao EDT.
static void invokeAndWait(Runnable doRun)
          Delega a execução de um objeto Runnable para a EDT do Swing usando o SwingUtilities.invokeAndWait.
static void invokeLater(Runnable doRun)
          Delega a execução de um objeto Runnable para a EDT do Swing.
static boolean isEventDispatchThread()
          Se o AppContext for null, podemos ter certeza que não estamos na EDT e, portanto, retorna sempre false.
static void setDebugMode(boolean error, boolean success)
          Configura os modos de debug para exibir mensagens na console durante os testes em desenvolvimento.
static void setPrinter(PrintStream... outputStreamList)
          Atribui uma lista de stream para saida do debug.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

SwingThreadDispatcher

public SwingThreadDispatcher()
Method Detail

invokeLater

public static void invokeLater(Runnable doRun)
Delega a execução de um objeto Runnable para a EDT do Swing. Se o AppContext não for null, o resultado é delegado para o comportamento default de SwingUtilities.invokeLater. Se o AppContext for null, delega para uma tarefa futura que é executada pela thread do Executor criado no init. SwingUtilities.invokeLater.

Parameters:
doRun - o objeto Runnable que é despachado para execução na EDT do Swing.

isEventDispatchThread

public static boolean isEventDispatchThread()
Se o AppContext for null, podemos ter certeza que não estamos na EDT e, portanto, retorna sempre false. Se o AppContext não for null, o resultado é delegado para o comportamento default de SwingUtilities.isEventDispatchThread

Returns:
true se a execução está na thread EDT e false caso contrário

invokeAndWait

public static void invokeAndWait(Runnable doRun)
                          throws InterruptedException,
                                 InvocationTargetException
Delega a execução de um objeto Runnable para a EDT do Swing usando o SwingUtilities.invokeAndWait. Se o AppContext não for null, o resultado é delegado para o comportamento default de SwingUtilities.invokeAndWait. Se o AppContext for null, usa uma FutureTask para submeter a um serviço de execução.

Parameters:
doRun - o objeto Runnable que é despachado para execução na EDT do Swing.
Throws:
InterruptedException - a mesma exceção InterruptedException lançada no SwingUtilities.invokeAndWait
InvocationTargetException - a mesma exceção InterruptedException lançada no SwingUtilities.invokeAndWait

init

public static void init()
Inicialização do executor para processamento das chamadas ao EDT. O init deve ser executado antes que o cliente interaja com o servidor por meio de observadores a serem gatilhados por RMI (contexto do bug). Não pode ser chamado quando o AppContext for null porque senão, o thread group do executor criado também mantém o AppContext null e, portanto, as chamadas ao método SwingUtilities.invokeLater lançará a exceção NPE.


setPrinter

public static void setPrinter(PrintStream... outputStreamList)
Atribui uma lista de stream para saida do debug.

Parameters:
outputStreamList - o array com a lista de streams usados no debug

setDebugMode

public static void setDebugMode(boolean error,
                                boolean success)
Configura os modos de debug para exibir mensagens na console durante os testes em desenvolvimento. O default é estar desabilitado.

Parameters:
error - para os testes em modo desenvolvimento exibir na console java as mensagens de debug quando a execução usa a solução de contorno para o BUG.
success - para os testes em modo desenvolvimento exibir na console java as mensagens de debug quando a execução é com sucesso.


Copyright © 2014 Tecgraf/PUC-Rio. All rights reserved.