Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como o Java para OS X 2013-004 afeta (interromper) os aplicativos Swing?


Atualização 2013-06-21:esta resposta contém algumas soluções alternativas e alternativas que podem ser úteis, mas a resposta de @sidney-markowitz-biomatters contém a correção de código correta - o LAF precisa ser definido no encadeamento do evento! em>

Os problemas recentes parecem estar relacionados às atualizações que quebram o Aqua Look and Feel (LAF), que é o padrão para aplicativos Swing no Mac OS X.

Se você precisa do Aqua LAF, não há muitas opções. Você pode precisar esperar pela próxima atualização do Java da Apple (suponho que eles corrigirão isso com prioridade, já que é o próprio LAF). Você também pode tentar usar o Java Application Bundler (ou seja, agrupar o Oracle JRE e evitar usar o JRE do sistema).

Se você conseguir usar um LAF diferente, seu aplicativo deverá funcionar normalmente. Ele fez para PaperCut, pelo menos (a atualização 003 causou alguns problemas de foco de janela, a atualização 004 causou caos).

Algumas opções:

  • Usando o LAF de plataforma cruzada específico da versão Java do código Java (por exemplo, Nimbus ou Metal):
    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName())
    

  • Definindo um LAF específico do código Java:
    UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel")
    

  • Substituindo o LAF padrão do terminal:
    java -Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel MyApp
    

No nosso caso, estávamos chamando explicitamente UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) em nosso código e queríamos uma solução alternativa que não envolvesse uma alteração de código (ou seja, um hotfix), então precisávamos substituir o sistema padrão LAF da seguinte forma.

  • Substituindo o sistema LAF do terminal:
    java -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel ...
    

  • Substituindo o LAF do sistema de um Info.plist arquivo (se você tiver empacotado como um aplicativo Mac, também funciona para as outras opções de VM) (por exemplo, em My.app/Contents/Info.plist ).

    Você deseja adicionar -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel até o fim do <string> valor para as VMOptions <key> . As opções são separadas por espaço, assim como no terminal. Por exemplo. se você já tiver um useScreenMenuBar opção:
    <key>VMOptions</key>
    <string>-Dcom.apple.macos.useScreenMenuBar=true -Dswing.systemlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel</string>
    




Editar:@trashgod pediu um exemplo reproduzível. Não tenho certeza de qual é o escopo completo dos problemas com a atualização 004, mas aqui está uma reprodução simples:

Atualização 21/06/2013 - do jeito errado, reproduzindo o erro:
public class AquaLafTest {
    public static void main(String[] args) throws Exception {
        javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
        javax.swing.JOptionPane.showMessageDialog(null, "msg");
    }
}

  1. Execute com o Apple JRE que vem com a atualização 004 (por exemplo, em /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home ). Observe que a mensagem não está visível, o ícone da caixa de diálogo não está visível e o botão não está visivelmente clicável.

  2. Execute com um Apple JRE mais antigo ou outro JRE. Observe que a caixa de diálogo é exibida conforme o esperado.

Atualização 2013-06-21 - do jeito certo, no encadeamento do evento, funciona corretamente:
public class AquaLafTest {
    public static void main(String[] args) throws Exception {
        javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                try {
                    javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
                    javax.swing.JOptionPane.showMessageDialog(null, "msg");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}