Aplicativo Java Desktop: SWT x Swing [fechado]

158

Sou desenvolvedor web de dia e estou pensando em criar meu primeiro aplicativo de desktop real. A idéia é criar uma ferramenta que automatize uma tarefa muito repetitiva em um aplicativo Web em que nenhuma API esteja disponível.

Eu sei que quero usar Java. Eu o usei antes para coisas na Web, conheço bem a sintaxe e quero que o aplicativo seja multiplataforma o mais fácil possível.

Onde não tenho tanta certeza é se devo usar SWT ou Swing. Como meu público-alvo principal usa o Windows, quero parecer o mais nativo possível lá. Linux e Mac devem funcionar, mas a aparência não é tão importante aqui.

Então, quais são os argumentos a favor e contra cada UI Framework, Swing ou SWT?

Obrigado.

PS: Eu desenvolvo no Windows usando o Eclipse. Mas estava pensando em brincar com o Netbeans.

janpio
fonte
Pergunta difícil. :-) Eu iria com o Swing. Mas, não tenha PRO ou CONs para essa decisão.
Pablo Santa Cruz
Q duplicado. por favor, procure Qs Swing vs. SWT já solicitados no SO. FWIW, eu uso o Swing apenas porque aprendi dessa maneira. Há bibliotecas look-and-feel nativas (ver JGoodies aparência)
Jason S
"constrói uma ferramenta que automatiza uma tarefa muito repetitiva em um aplicativo da web" - alguma informação sobre isso? Pode haver uma ferramenta existente - e eu questiono a necessidade de um aplicativo de desktop para automatizar isso - ele pode funcionar no seu caso agora - mas e se você mudar para uma solução hospedada?
Nate
Você não precisa aprender uma estrutura de GUI para um aplicativo de desktop. Se você pode usar html css e js (o que suponho que seja), você pode usar o Electron para criar aplicativos nativos com idiomas da web.
Pranav A.
O elétron foi inventado alguns anos depois que eu fiz essa pergunta;) Mas é claro que hoje você está certo.
janpio 14/09/18

Respostas:

152

Prós Swing:

  • parte da biblioteca java, não há necessidade de bibliotecas nativas adicionais
  • funciona da mesma maneira em todas as plataformas
  • Editor de GUI integrado no Netbeans e Eclipse
  • bons tutoriais online da Sun / Oracle
  • Suportado por extensões java oficiais (como java OpenGL)

Contras Swing:

  • A aparência nativa pode se comportar diferente do sistema nativo real.
  • componentes pesados ​​(nativo / awt) ocultam componentes de giro, não é um problema na maioria das vezes, pois o uso de componentes pesados ​​é bastante raro

Prós SWT:

  • usa elementos nativos quando possível, portanto, sempre comportamento nativo
  • suportado pelo eclipse, editor GUI VEP (VEP também suporta Swing e AWT)
  • grande número de exemplos online
  • possui uma ponte awt / swt integrada para permitir o uso de componentes awt e swing

Contras SWT:

  • requer bibliotecas nativas para cada sistema suportado
  • pode não suportar todo comportamento em todos os sistemas devido aos recursos nativos usados ​​(opções de dica)
  • gerenciamento de recursos nativos, enquanto componentes nativos geralmente são descartados com seus pais, outros recursos, como fontes, precisam ser liberados ou registrados manualmente como ouvintes de descarte de um componente para liberação automática.
josefx
fonte
33
Swing estará mais perto de "escrever uma vez, executar em qualquer lugar". O SWT será mais parecido com "escreva uma vez, ajuste / teste em todos os lugares". Mas essa mesma discussão aconteceu com outros idiomas também.
Mark
12
Realisticamente, a aparência "nativa" do Swing se comporta consideravelmente diferente da minha área de trabalho do Gnome - enquanto, por alguma razão, os temas funcionam muito bem, os menus são horríveis e quase inutilizáveis.
precisa saber é o seguinte
9
A partir do Eclipse 3.7, o VEP foi substituído pelo WindowBuilder (que também suporta Swing e SWT).
Alexey Romanov
6
A vantagem do SWT também é menos consumo de memória por causa dos componentes nativos. Isso deve ser desejável em máquinas com memória limitada e diferenças de memória entre swing e swt podem ser grandes em projetos de GUI grandes.
jantobola
1
@JanTobola Está completamente errado. Componentes nativos usam memória alocada no heap nativo, não apenas no heap Java. Eu trabalhei em grandes GUIs usando a Plataforma Netbeans, Eclipse RCP, SWT e Swing. Havia algumas preocupações sérias de pegada de memória no Swing em versões muito antigas do Java (quando era uma biblioteca de terceiros e depois de 1.1 a 1.2 também? ), mas não é mais verdade e cabe aos desenvolvedores liberar muitos recursos no SWT, há muito mais oportunidades de vazamento de memória no SWT, enquanto um componente não referenciado acaba sendo "descartado" pelo Swing.
18718 Gouessej #
63

Uma coisa importante a considerar é que alguns usuários e alguns revendedores (Dell) instalam uma VM de 64 bits no Windows de 64 bits e não é possível usar a mesma biblioteca SWT em VMs de 32 e 64 bits.

Isso significa que você precisará distribuir e testar pacotes diferentes, dependendo de os usuários terem uma Java VM de 32 ou 64 bits. Veja esse problema com o Azureus, por exemplo, mas você também o possui com o Eclipse, onde até o momento as compilações na página de download inicial não são executadas em uma VM de 64 bits.

Ludovico Fischer
fonte
2
Ponto interessante. Como usuário, ainda estou confuso por que isso é tão importante. Mas bem, é assim que terei que considerar isso. Obrigado.
janpio
btw: javaws (webstart) não está disponível para 64 IMHO
Karussell
1
@Karussell: A partir de 3/4/2011, a JVM de 64 bits da Sun para Windows tinha suporte a JNLP. Eu acho que isso é verdade há um tempo, mas não sei quanto tempo.
O Alquimista
23

pro swing:

  • A maior vantagem do swing IMHO é que você não precisa enviar as bibliotecas com seu aplicativo (o que evita dezenas de MB (!)).
  • A aparência nativa é muito melhor para swing do que nos primeiros anos
  • o desempenho é comparável ao swt (o balanço não é lento!)
  • O NetBeans oferece o Matisse como um construtor de componentes confortável.
  • A integração dos componentes Swing no JavaFX é mais fácil.

Mas, no final das contas, eu não sugeriria usar swing 'puro' ou swt ;-) Existem várias estruturas de aplicativos para swing / swt out. Olha aqui . Os maiores players são netbeans (swing) e eclipse (swt). Outra boa estrutura poderia ser griffon e um bom 'conjunto de componentes' é o pivô (giro). Griffon é muito interessante porque integra muitas bibliotecas e não apenas oscila ; também pivô, swt, etc

Karussell
fonte
1
Sim, o NetBeans tem o Matisse como um construtor de GUI, mas o código é realmente detalhado, de leitura confusa e quase impossível de editar pelo código-fonte. Se você realmente quer um construtor go GUI com eclipses WindowBuilder
Pranav A.
13

Eu usaria o Swing por alguns motivos.

  • Já existe há mais tempo e teve mais esforço de desenvolvimento aplicado a ele. Portanto, é mais provável que o recurso seja concluído e (talvez) tenha menos bugs.

  • Há muita documentação e outras orientações sobre a produção de aplicativos de alto desempenho.

  • Parece que as alterações no Swing se propagam para todas as plataformas simultaneamente, enquanto as alterações no SWT parecem aparecer primeiro no Windows, depois no Linux.

Se você deseja criar um aplicativo muito rico em recursos, consulte o NetBeans RCP (Rich Client Platform). Há uma curva de aprendizado, mas você pode montar aplicativos agradáveis ​​rapidamente com um pouco de prática. Não tenho experiência suficiente com a plataforma Eclipse para fazer um julgamento válido.

Se você não deseja usar todo o RCP, o NetBeans também possui muitos componentes úteis que podem ser extraídos e usados ​​independentemente.

Mais uma palavra de conselho: analise os diferentes gerenciadores de layout. Eles me tropeçaram por um longo tempo quando eu estava aprendendo. Alguns dos melhores nem sequer estão na biblioteca padrão. As ferramentas MigLayout (para Swing e SWT) e JGoodies Forms são duas das melhores na minha opinião.

clartaq
fonte
10

Eu escolheria swing apenas porque é "nativo" para java.

Além disso, dê uma olhada em http://swingx.java.net/ .

zerado
fonte
1
O link está quebrado!
Sócrates
8

Para seus requisitos, parece que o resultado final será o uso do Swing, pois é um pouco mais fácil começar e não tão integrado à plataforma nativa quanto o SWT.

Swing geralmente é uma aposta segura.

Yuval Adam
fonte
6

Pergunta interessante. Eu não sei muito bem o SWT para se gabar (ao contrário do Swing e do AWT), mas aqui está a comparação feita no SWT / Swing / AWT.

http://www.developer.com/java/other/article.php/10936_2179061_2/Swing-and-SWT-A-Tale-of-Two-Java-GUI-Libraries.htm

E aqui está o site onde você pode obter tutoriais sobre basicamente qualquer coisa no SWT ( http://www.java2s.com/Tutorial/Java/0280__SWT/Catalog0280__SWT.htm )

Espero que você tome uma decisão correta (se houver decisões corretas na codificação) ... :-)

Buhake Sindi
fonte
4
Mas observe o artigo é a partir de 2003 ...
Alexey Romanov
4

Se você planeja construir aplicativos funcionais completos com mais de um punhado de recursos, sugiro pular direto para o uso do Eclipse RCP como estrutura.

Se seu aplicativo não crescer muito ou seus requisitos forem únicos demais para serem tratados por uma estrutura comercial normal, você poderá saltar com segurança com o Swing.

No final do dia, sugiro que você tente as duas tecnologias para encontrar a que melhor combina com você. Como o Netbeans vs o Eclipse e o IntelliJ, não há a resposta correta absoluta aqui e as duas estruturas têm suas próprias desvantagens.

Pro Swing:

  • mais especialistas
  • mais parecido com Java (quase nenhum campo público, sem necessidade de dispor de recursos)

Pro SWT:

  • mais SO nativo
  • Mais rápido
Nanda
fonte
10
Eu acho que o ponto "mais rápido" é altamente controverso.
Russ Hayward
O SWT é complicado de usar, tive que testar minha GUI em cada versão do Windows, alguns bugs eram reproduzíveis apenas no Windows Vista. Alguns métodos são simplesmente não implementados ou chame o AWT por baixo do capô, o que significa que você não pode usar um JRE compacto sem AWT e Swing sem correr o risco de quebrar o SWT. Comecei a usar o SWT em 2009 e, na minha humilde opinião, não é mais rápido. Aconselho que você forneça uma referência cuidadosamente projetada.
21418 Gouessej #
4

Uma coisa a considerar: Screenreaders

Por alguns motivos, alguns componentes do Swing não funcionam bem ao usar um leitor de tela (e o Java AccessBridge para Windows). Saiba que diferentes leitores de tela resultam em comportamentos diferentes. E, na minha experiência, o SWT-Tree tem um desempenho muito melhor que o Swing-Tree em combinação com um leitor de tela. Assim, nosso aplicativo acabou usando os componentes SWT e Swing.

Para distribuir e carregar a biblioteca SWT adequada, você pode encontrar este link útil: http://www.chrisnewland.com/select-correct-swt-jar-for-your-os-and-jvm-at-runtime-191

incomudro
fonte
3

O SWT foi criado como uma resposta à lentidão do Swing na virada do século. Agora que as diferenças de desempenho estão se tornando insignificantes, acho que o Swing é uma opção melhor para seus aplicativos padrão. O SWT / Eclipse possui uma estrutura legal que ajuda com muitos códigos de placas de caldeira.

Oliver Watkins
fonte