Quais são as melhores práticas de desenvolvimento do Java Swing?

17

Ao fazer minha pré-pesquisa para essa pergunta , descobri que não há muitas informações bem organizadas sobre as melhores práticas do Java Swing disponíveis na Internet. Então, acho que vou dar uma chance ao Stack Exchange de construir essa lista excelente.

Quais são as melhores práticas de desenvolvimento do Java Swing? O que você encontrou para trabalhar para você e por quê?

Pops
fonte
2
Eu brinquei com o Swing na escola, e não foi uma experiência agradável. A coisa toda parecia inchada e desnecessariamente complexa. A melhor prática pode ser usar outra coisa.
Robert Harvey
1
@RobertHarvey "brincar na escola" está muito longe de fornecer software de produção. Descobri que o Swing pode fazer tudo o que era necessário de uma maneira lógica e razoável.
Bem, coloque desta maneira: se fosse tão difícil em um mero projeto escolar, seria quase inimaginavelmente difícil em um projeto real.
Robert Harvey
1
Poder @RobertHarvey vem com um preço ...
Apenas mais uma coisa importante. Os componentes do balanço são serializáveis ​​e têm muitos ancestrais. Portanto, eles são muito pesados ​​para herdar na maioria dos casos. Você deve considerar alguma técnica de quebra automática, especialmente quando tiver um estado não serializável. Se você herdar de um componente, use-o como uma visualização (no MVC ou em um padrão semelhante).
Dávid Horváth 28/11

Respostas:

12

Só posso responder pelo que funcionou para mim. Outros comentaristas apontaram que as GUIs do Java em geral se enquadram no 'vale misterioso' da aparência não muito nativa, e eu não discuto isso.

Faça bom uso da API de ação. Ele permite que você encapsule melhor as diferentes ações que seu usuário executará e permite conectá-las a atalhos, teclas aceleradoras, botões e outros objetos de entrada com muito mais facilidade.

Use um gerenciador de layout apropriado. O GridBagLayout é extremamente poderoso, mas eu diria que é impossível de manter, sem uma quantidade excessiva de comentários. Quando executo ferramentas de análise de código estático, como o Sonar, em um aplicativo GUI mais antigo que mantenho, ele sempre aponta grandes quantidades de números mágicos para tornar o layout do GridBags adequado. Eu tive muito sucesso com o GroupLayout, que evita precisar especificar o alinhamento perfeito de pixels.

Se você acha que precisa de um JDialog ... provavelmente não precisa . As caixas de diálogo são horríveis, em termos de experiência do usuário - esse aplicativo decidiu usá-las em todos os menus e formulários e aplicar regras sempre disponíveis de maneira bizarra. Isso se transformou em um pesadelo de manutenção quando, na verdade, precisamos alertar algo sobre o menu. Sugestão frustrada clicando em caixas de diálogo fora de foco - e, portanto, indissociáveis ​​-.

Use o SwingWorker em vez de rolar seu próprio multithreading, onde apropriado. É muito fácil estender o SwingWorker e executar algumas tarefas demoradas, fornecendo atualizações regulares de volta à GUI. Pense em baixar uma atualização do cliente. Ele manipulará o agendamento de threads de trabalho para você e permitirá que você publique as porcentagens de download de volta à exibição, para que você possa atualizar sua ProgressBar ou o que você tem.

É tudo o que posso sugerir em minha experiência reconhecidamente limitada.

Tom G
fonte
2
JDialogestá perfeitamente bem - desde que você o use para diálogos.
Jonas
1
Concordo que eles estão bem se você os estiver usando para obter informações que absolutamente devem ser vistas - e agidas - imediatamente. Mas a maioria das informações realmente não precisa atrapalhar muito a experiência do usuário. Esse foi o ponto por trás da minha qualificação.
Tom G
@ Jonas, acho que o ponto é que os diálogos são uma coisa ruim (independentemente de serem implementados com JDialogou não).
Tom Hawtin - defina
1
O acoplamento é um pouco ruim, mas é melhor IMO do que escrever seu próprio código de encadeamento. Prefiro lidar com o código deselegante do que com sutis erros de thread.
Tom G
3
Você pode querer olhar para MigLayout - miglayout.com
4

Eu diria que uma das primeiras coisas é não trabalhar diretamente nisso. O sistema de layout no Swing (IMHO) é terrível, e tentar fazer com que qualquer aplicativo substancial seja um pesadelo.

Dois dos muitos gerenciadores de layout alternativos que eu usei são o MigLayout e o MultiSplitPane. O MigLayout é de uso mais geral e cria qualquer layout em que você possa pensar de maneira fácil e sã. O MultiSplitPane é mais específico; Usei-o para fazer alguns layouts simples para GUI's que não tinham muita complexidade.

EDIT : Isso não substitui o balanço . Se você precisar usar o Swing, ainda poderá usar esses gerenciadores de layout, pois eles gerenciam apenas o swing, não substituí-lo.


Claro que a melhor alternativa é simplesmente não usar o Swing. O swing é muito criticado por ser horrível de se trabalhar, não parece nativo e lento. Existem muitas alternativas que aprenderam com o swing o que não fazer, como Qt, SWT e até o GTK. Estas são ótimas soluções de longo prazo para as dores de cabeça do Swing

EDIT : Como o Senhor Torgamus disse, eles não estão realmente disponíveis se você for forçado a usar o Swing. Se você usar essas opções da melhor maneira possível para resolver isso ao criar seu projeto, não a 3/4 do caminho ou ao escolher aplicativos herdados.

Também gostaria de observar que a maioria das GUIs alternativas usa bibliotecas nativas para se parecer com o sistema operacional e, em seguida, recorrer ao Swing ou a outra GUI Java pura.

TheLQ
fonte
4
Agradeço sua opinião, mas "não use o Swing" não é útil para pessoas que acabam com essa pergunta porque estão sendo forçadas a usar o Swing por um motivo ou outro.
Pops
@ Lord É por isso que sugeri gerenciadores de layout alternativos antes de sugerir QT e SWT. Use o caminho que puder.
TheLQ
"O sistema de layout no Swing (IMHO) é terrível, e tentar fazer com que qualquer aplicativo substancial seja um pesadelo." Os gerentes de layout tendem a vir do AWT, não do Swing. É verdade que existem alguns específicos do Swing, como BoxLayout e GroupLayout. Dito isso, os gerenciadores de layout são completamente opcionais ... você pode especificar as coordenadas de cada componente, exatamente como no .NET WinForms (exceto que o .NET possui uma boa interface gráfica para isso).
Powerlord
3
Dê uma olhada no MigLayout - miglayout.com
1
@ TheLQ Ok, eu concordo com o gerenciador de arquivos do Swing, esse é realmente estúpido (no Mac OS X também). Enfim, eu apenas uso o gerenciador de arquivos do AWT para corrigir isso. Funciona bem, mesmo que o restante do aplicativo seja feito usando o Swing.
Stommestack