Estruturas de GUI Java. O que escolher? Swing, SWT, AWT, SwingX, JGoodies, JavaFX, Apache Pivot? [fechadas]

228

Existem muitas estruturas de GUI disponíveis para java, mas o que é reconhecido como a estrutura de escolha atual?

A seguir, é minha compreensão das diferentes estruturas, corrija-me se estiver errado. Este é um conjunto de perguntas muito pouco definido, mas ainda acho que é valioso para quem pensa em criar aplicativos avançados da GUI.


AWT

É a própria base do balanço, ele tem um bom desempenho, mas falta componentes avançados. Se você pretende criar aplicativos avançados, o AWT provavelmente não é o caminho a percorrer. No entanto, para aplicativos GUI menores, que não exigem interfaces de usuário avançadas. Isso pode se encaixar perfeitamente, pois é uma estrutura testada e comprovada.


Balanço

Baseado no AWT, como indicado anteriormente. Na sua infância, era considerado lento e com erros e fez com que a IBM criasse o SWT para Eclipse. No entanto, com o Java 5 (ou 6?) Swing tornou-se a estrutura de escolha para a construção de novos aplicativos. O Swing tem muitos componentes ricos, mas ainda faltam em algumas áreas. Um exemplo é que não há um componente TreeTable com todos os recursos que pode classificar e filtrar / pesquisar.


SWT

Criados pela IBM para Eclipse, eles pareciam pensar que o Swing não era adequado para o Eclipse na época. Por si só, é bastante de baixo nível e usa os widgets nativos da plataforma por meio do JNI. Não está relacionado ao Swing e ao AWT. Sua API é, no entanto, um pouco desajeitada e não intuitiva. Eles possuem alguns componentes avançados, como uma TreeTable. (mas acho que eles não oferecem suporte à classificação e filtragem fora da caixa). O SWT usa algumas ligações nativas (por meio do JNI?) E o discurso retórico na Internet é que essa estrutura não deve ser usada nos projetos de hoje. (Por que não?)


SwingX

Baseado no Swing e sua missão é criar componentes ricos para o swing. Ainda em desenvolvimento. (embora não muito ativo.) Tenha um conjunto muito bom de componentes, como, por exemplo, TreeTable. Mas o TreeTable não suporta filtragem e classificação, tanto quanto eu sei. No entanto, ele suporta a pesquisa com destaque.

Observe que SwingX são componentes (AFAIU) que são extensões ou composições de componentes Swing existentes


JGoodies

Um quadro sobre o qual não sei nada ... O que é seus pontos fortes e fracos? O que diferencia os Jgoodies do resto?

O JGoodies OTOH trata de PLAFs e layouts.


JavaFX

O mais recente carro-chefe do Java / Oracle. prometendo ser o padrão de fato no desenvolvimento de aplicativos avançados para desktop ou web.


Apache Pivot

Ele renderiza a interface do usuário usando Java2D, minimizando o impacto dos legados (IMO, inchados) do Swing e do AWT. (@Augustus Thoo)

Seu foco principal parece estar no RIA (Rich Internet Applications), mas parece que também pode ser aplicado a aplicativos de desktop. E como um comentário pessoal, parece muito interessante! Eu gosto especialmente que é um projeto apache.

https://cwiki.apache.org/PIVOT/frequently-asked-questions-faq.html


Qt Jambi

Um wrapper java para a biblioteca qt nativa, escrito em c / c ++. Muito poderoso, amplamente utilizado e aceito. Possui muitos componentes da GUI e uma API fácil de usar.

http://qt-jambi.org/


Então, para tentar resumir um pouco do que estou perguntando:

Diga que eu queria criar um aplicativo de desktop hoje em Java que envolva muitos componentes avançados, o que devo escolher? E porque?

Qual dessas estruturas deve ser reconhecida como obsoleta e quais devem ser reconhecidas como estruturas de um futuro distante?

O que é a estrutura padrão de fato de hoje e quais ferramentas você utiliza para criar aplicativos java gui?


Posso me arrepender de perguntar isso, mas vou tentar de qualquer maneira:

Diz-se que C # / .net possui um conjunto muito bom de componentes fáceis de usar que podem ser flexionados em todas as direções possíveis. E depois de investigar diferentes estruturas Java, até certo ponto, não consigo dizer o mesmo sobre Java. Por que é isso? Por que o java (que é a linguagem de programação mais usada no mundo) não tem o mesmo conjunto de componentes da GUI?

Será que o java baseou seus componentes de GUI em um nível muito mais baixo e é possível escrever todos esses componentes avançados que estou procurando, mas você precisa fazer muito, se não todo o trabalho?

netbrain
fonte
Eu não sabia que o SWT era "baseado em uma combinação de AWT e Swing". Esse é realmente o caso? Eu pensei que era pura JNI para invocar sistema de janelas do sistema operacional ...
Rico
@ Rich Oh, foi dito em um dos comentários respostas. Eu apenas presumi que eles sabiam do que estavam falando.
Netbrain 9/09/11
4
Eu acho que você confunde "UI Toolkit" e "GUI framework". AWT, Swing e SWT são kits de ferramentas da interface do usuário, mas eu certamente não os chamaria de "estruturas". As estruturas são baseadas em um determinado kit de ferramentas da interface do usuário e fornecem a cola para criar seu aplicativo. Primeiro, você deve escolher o kit de ferramentas da interface do usuário e, em seguida, escolher uma estrutura que funcione nesse kit de ferramentas. FWIW, eu escolheria balanço com o meu próprio quadro Guts-GUI caseiro :-)
jfpoilpret
1
É quase sempre Swing vs. SWT (pelo menos para mim), para uma pequena comparação, você pode verificar Quais são as principais coisas que um programador Java SWT experiente deve estar ciente ao mudar para o Swing? ..
Sorceror
2
O JavaFX não faz mais parte do SDK de visualização e está disponível para uso em Produção. atualize esta postagem.

Respostas:

79

Árvore de decisão:

  1. Estruturas como Qt e SWT precisam de DLLs nativas. Então você deve se perguntar: todas as plataformas necessárias são suportadas? Você pode empacotar as DLLs nativas com seu aplicativo?

    Veja aqui como fazer isso no SWT .

    Se você tem uma escolha aqui, deve preferir o Qt ao invés do SWT. O Qt foi desenvolvido por pessoas que entendem a interface do usuário e a área de trabalho, enquanto o SWT foi desenvolvido por necessidade para tornar o Eclipse mais rápido. É mais um patch de desempenho para Java 1.4 do que uma estrutura de interface do usuário. Sem o JFace, você está perdendo muitos componentes principais da interface do usuário ou recursos muito importantes dos componentes da interface do usuário (como a filtragem em tabelas).

    Se o SWT estiver com falta de um recurso necessário, a estrutura será um pouco hostil para estendê-lo. Por exemplo, você não pode estender nenhuma classe nela (as classes não são finais, elas apenas lançam exceções quando o pacote this.getClass()não é org.eclipse.swte você não pode adicionar novas classes nesse pacote porque está assinado).

  2. Se você precisar de uma solução Java pura e nativa, isso o deixará com o resto. Vamos começar com AWT, Swing, SwingX - a maneira Swing.

    O AWT está desatualizado. O Swing está desatualizado (talvez menos, mas pouco trabalho foi feito no Swing nos últimos 10 anos). Você poderia argumentar que Swing era bom para começar, mas todos sabemos que esse código apodrece. E isso é especialmente verdade para as UIs hoje.

    Isso deixa você com o SwingX. Após um longo período de progresso lento, o desenvolvimento voltou a crescer . A principal desvantagem do Swing é que ele se apega a algumas idéias antigas, que meio que parecem muito complicadas há 15 anos, mas que hoje parecem "desajeitadas". Por exemplo, as visualizações de tabela suportam filtragem e classificação, mas você ainda precisa configurá-lo. Você precisará escrever muito código da placa da caldeira apenas para obter uma interface de usuário decente que pareça moderna.

    Outra área fraca é o tema. A partir de hoje, existem muitos temas por aí. Veja aqui os 10 melhores . Mas alguns são lentos, outros são de buggy, outros são incompletos. Odeio quando escrevo uma interface do usuário e os usuários reclamam que algo não funciona para eles porque selecionaram um tema estranho.

  3. O JGoodies é outra camada no topo do Swing, como o SwingX. Ele tenta tornar o Swing mais agradável de usar. O site está ótimo. Vamos dar uma olhada no tutorial ... hm ... ainda procurando ... aguente firme. Parece que não há documentação no site. Google para o resgate . Não, não há tutoriais úteis.

    Não estou me sentindo confiante com uma estrutura de interface do usuário que tenta tanto esconder a documentação de novos fãs em potencial. Isso não significa que o JGoodies seja ruim; Eu simplesmente não consegui encontrar nada de bom para dizer sobre isso, mas que parece bom.

  4. JavaFX. Ótimo, elegante. O suporte existe, mas acho que é mais um brinquedo brilhante do que uma estrutura de interface do usuário séria. Esse sentimento está na falta de componentes complexos da interface do usuário, como tabelas em árvore. Há um componente baseado em webkit para exibir HTML .

    Quando foi introduzido, meu primeiro pensamento foi "cinco anos tarde demais". Se o seu objetivo é um bom aplicativo para telefones ou sites, bom. Se seu objetivo é um aplicativo de desktop profissional, verifique se ele entrega o que você precisa.

  5. Pivô. Primeira vez que ouvi sobre isso. É basicamente uma nova estrutura de interface do usuário baseada em Java2D. Então, eu tentei ontem. No Swing, apenas um pouquinho de AWT ( new Font(...)).

    Minha primeira impressão foi boa. Existe uma extensa documentação que ajuda você a começar. A maioria dos exemplos vem com demonstrações ao vivo (Nota: você deve ter o Java ativado no navegador da Web; isso é um risco de segurança ) na página da Web, para poder ver o código e o aplicativo resultante lado a lado.

    Na minha experiência, mais esforço entra no código do que na documentação. Observando os documentos do Pivot, foi necessário muito esforço no código. Observe que atualmente existe um bug que impede alguns exemplos de funcionar ( PIVOT-858 ) no seu navegador.

    Minha segunda impressão do Pivot é que é fácil de usar. Quando encontrei um problema, geralmente conseguia resolvê-lo rapidamente, procurando um exemplo. Estou sentindo falta de uma referência de todos os estilos que cada componente suporta.

    Como no JavaFX, faltam alguns componentes de nível superior, como um componente de tabela em árvore ( PIVOT-306 ). Não tentei carregar preguiçosamente com a exibição de tabela. Minha impressão é que, se o modelo subjacente usa carregamento lento, isso é suficiente.

    Promissor. Se você puder, tente.

Aaron Digulla
fonte
Tentei a demonstração do Pivot "Kitchen sink", depois de abrir alguns grupos, ele continua comendo toda a CPU. Se é por causa do design do Pivot, definitivamente não o quero nos meus projetos.
Exibir nome
Parece que eu encontrei a fonte do problema e ela foi corrigida em versões posteriores: apache-pivot-users.399431.n3.nabble.com/…
Exibir nome
2
O JavaFX 8 (para Java 8 e superior) possui um widget TreeTableView. No entanto, o JavaFX 2.2 (para Java 7) não possui isso e também possui erros padrão e informações dialgos: consulte stackoverflow.com/a/12760202/105137 . Também o ControlsFX widget de biblioteca está disponível para Java 8 apenas: fxexperience.com/controlsfx
kostmo
12

O SWT por si só é bastante de baixo nível e usa os widgets nativos da plataforma por meio do JNI. Não está relacionado ao Swing e ao AWT. O IDE Eclipse e todos os aplicativos Rich Client baseados em Eclipse, como o cliente Vuze BitTorrent , são construídos usando SWT. Além disso, se você estiver desenvolvendo plug-ins do Eclipse, normalmente utilizará o SWT.
Desenvolvo aplicativos e plug-ins baseados em Eclipse há quase 5 anos, por isso sou claramente tendencioso. No entanto, também tenho uma vasta experiência no trabalho com o SWT e o kit de ferramentas JFace UI, que é construído sobre ele. Eu achei o JFace muito rico e poderoso; em alguns casos, pode até ser o principal motivo para a escolha do SWT. Ele permite que você instale rapidamente uma interface de trabalho, desde que parecida com IDE (com tabelas, árvores, controles nativos, etc.). É claro que você também pode integrar seus controles personalizados, mas isso exige um esforço extra.

Zsolt Török
fonte
Na sua opinião, um componente avançado como um TreeTable com classificação e filtragem de colunas seria um grande problema no SWT + JFace?
Netbrain 9/09/11
@netbrain: Eu já fiz isso várias vezes, é bastante direto com o JFace. Isso é o que eu quis dizer com interface "tipo IDE", talvez não seja a melhor escolha de palavras.
Zsolt Török
9

Gostaria de sugerir outra estrutura: Apache Pivot http://pivot.apache.org/ .

Eu tentei-o brevemente e ficou impressionado com o que ele pode oferecer como um quadro RIA (Rich Internet Application) ala do Flash.

Ele renderiza a interface do usuário usando Java2D, minimizando o impacto dos legados (IMO, inchados) do Swing e do AWT.

Augustus Thoo
fonte
1
Tive a impressão de que o netbrain estava perguntando sobre aplicativos de desktop. Para estruturas RIA, considere também GWT e Vaadin. Essas estruturas permitem escrever em Java, compilar e obter JavaScript que roda muito bem em todos os navegadores da web comuns.
Costis Aivalis 9/09/11
Não é possível aplicar o pivô para aplicativos de desktop?
Netbrain 9/09/11
Talvez seja uma questão de definição, mas as estruturas RIA são basicamente projetadas para serem executadas nos navegadores.
Costis Aivalis 9/09/11
2
@netbrain: Sim, você pode executar o Pivot como aplicativo de desktop (JFrame) ou applet (JApplet).
Augustus Thoo 9/09/11
9

Swing + SwingX + Miglayout é a minha combinação de escolha. O Miglayout é muito mais simples do que o Swings percebeu 200 gerenciadores de layout diferentes e muito mais poderoso. Além disso, fornece a capacidade de "depurar" seus layouts, o que é especialmente útil ao criar layouts complexos.

helpermethod
fonte
8

Outra opção é usar o Qt Jambi . Possui quase toda a grandeza do Qt (muitos componentes, boa documentação, fácil de usar), sem o incômodo do C ++. Eu o usei há 3-4 anos para um projeto pequeno, mesmo assim estava quase maduro.

Você pode querer ver a discussão sobre Swing vs. Qt aqui .

nimcap
fonte
5

Minha opinião pessoal: Vá para o Swing junto com a plataforma NetBeans.

Se você precisar de componentes avançados (mais do que o NetBeans oferece), poderá integrar facilmente o SwingX sem problemas (ou JGoodies), pois a plataforma NetBeans é completamente baseada no Swing.

Eu não iniciaria um aplicativo de área de trabalho grande (ou um que seja grande) sem uma boa plataforma baseada na estrutura de interface do usuário subjacente.

A outra opção é SWT junto com o Eclipse RCP, mas é mais difícil (embora não impossível) integrar componentes Swing "puros" a esse aplicativo.

A curva de aprendizado é um pouco íngreme para a plataforma NetBeans (embora eu ache que seja verdade também para o Eclipse), mas existem alguns bons livros sobre os quais eu recomendo.

um cavalo sem nome
fonte
1
Observe que SwingX são componentes (AFAIU) que são extensões ou composições de componentes Swing existentes. O JGoodies OTOH trata de PLAFs e layouts. Mas, como você disse, ambos se integrarão perfeitamente ao Swing.
Andrew Thompson
1
+1 Baseie seu desenvolvimento no Swing. O Swing é construído sobre o AWT e inclui componentes leves que parecem e se comportam da mesma forma em todas as plataformas; portanto, você nunca deve usar os componentes AWT diretamente. Há um grande número de excelentes beans que você pode adicionar facilmente à sua GUI de desenvolvimento, como por exemplo toedter.com JCalendar.
Costis Aivalis
1
@ Andrew, além do PLAF e do layout, o JGoodies oferece mais: ligação de beans (para padrão de modelo de apresentação), validação e uma estrutura "semelhante ao JSR-296" (que é comercial).
Jfpoilpret 9/09/11
3

você esqueceu o Java Desktop Aplication baseado no JSR296 como Swing Framework interno no NetBeans

excluindo AWT e JavaFX, todas as suas estruturas descritas são baseadas no Swing; se você começar com o Swing, entenderá (claramente) todas essas estruturas baseadas no Swing.

ATW, SWT (Eclipse), Aplicação Java Desktop (Netbeans), SwingX, JGoodies

todas as estruturas (não sei mais nada sobre JGoodies) incl. O JavaFX não progride há muito tempo, muitos frameworks baseados no Swing são interrompidos, se não houver, sem a versão mais recente

apenas a minha opinião - o melhor deles é o SwingX, mas exigia um conhecimento mais profundo sobre o Swing,

Aparência dos frameworks baseados no Swing

mKorbel
fonte
parte deles nos componentes AWT, parte no Swing JCompoentns, mas entre AWT e Swing há diferença nos métodos implementados, acessíveis e hereditários, por exemplo, o Swing JComponents diretamente (API) implementa muitos métodos
herdados
O JSR296 está morto. Ele não é mais "mantido" e o suporte para ele foi removido do NetBeans. (E isso nunca foi realmente um bom quadro para começar)
a_horse_with_no_name
@a_horse_with_no_name esse direito with same progressem SWT, SwingX, novo proprietário, novas maniers
mKorbel
1
O SWT, desenvolvido pela IBM, não é baseado no Swing, é / era uma tecnologia concorrente. Swing usa AWT. O JavaFX também não é baseado no Swing. É uma estrutura totalmente nova. Alguns estão chamando o sucessor de Swing, mas ainda é imaturo para chamar isso de batalha. Estou tomando exatamente a mesma decisão no momento, e Swing é meu candidato, simplesmente pelo fato de ser a opção mais madura e realista possível.
Gordon
1
O SwingX é uma extensão do Swing (é por isso que requer conhecimento do Swing); de fato, alguns dos recursos do SwingX foram incorporados no próprio Swing.
Gordon
3

Fiquei muito satisfeito com o Swing para os aplicativos de área de trabalho em que estive envolvido. No entanto, compartilho sua opinião sobre o Swing não oferecer componentes avançados. O que eu fiz nesses casos é ir para o JIDE. Não é gratuito, mas também não é tão caro e oferece muito mais ferramentas. Especificamente, eles oferecem uma TreeTable filtrável.

sbrattla
fonte
Bom saber! Então JIDE criou seus próprios componentes baseados no balanço ...
netbrain
Sim, o JIDE criou alguns componentes que cobrem grades, árvores, tabelas, gráficos e similares. Como eu disse, não é gratuito, mas dado o tempo necessário para você mesmo fazer essas coisas, é melhor usar algo que já foi feito. Além disso, até onde eu entendo, o JIDE é flexível no que diz respeito a permitir que projetos de código aberto usem seus componentes em troca de um link para seu site ou um logotipo na caixa de diálogo 'Sobre'.
sbrattla
3

Eu iria com Swing. Para o layout, eu usaria o layout do formulário JGoodies. Vale a pena estudar o white paper sobre o Layout do formulário aqui - http://www.jgoodies.com/freeware/forms/

Além disso, se você começar a desenvolver um aplicativo de desktop enorme, precisará de uma estrutura. Outros apontaram a estrutura do netbeans. Eu não gostei muito, então escrevi um novo que agora usamos na minha empresa. Eu coloquei no sourceforge, mas não encontrei tempo para documentar muito. Aqui está o link para procurar o código:

http://swingobj.svn.sourceforge.net/viewvc/swingobj/

O mostruário deve mostrar como fazer um logon simples, na verdade.

Deixe-me saber se você tiver alguma dúvida, eu poderia ajudar.

sethu
fonte