Qual é a diferença entre Swing e AWT?

Respostas:

235

AWT é uma interface Java para o código da GUI do sistema nativo presente no seu sistema operacional. Não funcionará da mesma maneira em todos os sistemas, embora tente.

Swing é uma GUI Java mais ou menos pura. Ele usa o AWT para criar uma janela do sistema operacional e, em seguida, pinta imagens de botões, etiquetas, texto, caixas de seleção etc. nessa janela e responde a todos os cliques do mouse, entradas de teclas etc., decidindo por si próprio o que fazer em vez de deixar o sistema operacional lidar com isso. Portanto, o Swing é 100% portátil e é o mesmo em todas as plataformas (embora seja skinnable e tenha uma "aparência e plugabilidade" que podem torná-lo mais ou menos como a aparência das janelas e widgets nativos).

Essas são abordagens muito diferentes para os kits de ferramentas da GUI e têm muitas consequências. Uma resposta completa para sua pergunta tentaria explorar todas elas. :) Aqui estão algumas:

O AWT é uma interface de plataforma cruzada, portanto, embora use o SO subjacente ou o kit de ferramentas da GUI nativa para sua funcionalidade, ele não fornece acesso a tudo o que esses kits de ferramentas podem fazer. Os widgets AWT avançados ou mais recentes que possam existir em uma plataforma podem não ser suportados em outra. Os recursos de widgets que não são iguais em todas as plataformas podem não ser suportados ou, pior ainda, podem funcionar de maneira diferente em cada plataforma. As pessoas costumavam investir muito esforço para fazer com que seus aplicativos AWT funcionassem de maneira consistente em várias plataformas - por exemplo, eles podem tentar fazer chamadas para o código nativo do Java.

Como o AWT usa widgets da GUI nativa, seu sistema operacional os conhece e lida com a colocação um na frente do outro, etc., enquanto os widgets Swing são pixels sem sentido dentro de uma janela do ponto de vista do seu sistema operacional. O próprio Swing lida com o layout e o empilhamento dos widgets. A mistura de AWT e Swing não é suportada e pode levar a resultados ridículos, como botões nativos que ocultam tudo na caixa de diálogo em que residem porque tudo foi criado com o Swing.

Como o Swing tenta fazer todo o possível em Java, exceto as rotinas gráficas muito brutas fornecidas por uma janela da GUI nativa, ele costumava sofrer uma penalidade de desempenho em comparação com o AWT. Infelizmente, o Swing demorou a entender. No entanto, isso diminuiu drasticamente nos últimos anos devido a JVMs mais otimizadas, máquinas mais rápidas e (presumo) otimização dos componentes internos do Swing. Hoje, um aplicativo Swing pode ser executado rápido o suficiente para ser reparado ou até zippy, e quase indistinguível de um aplicativo usando widgets nativos. Alguns dirão que demorou muito para chegar a esse ponto, mas a maioria dirá que vale a pena.

Finalmente, você também pode querer conferir o SWT (o kit de ferramentas da GUI usado para o Eclipse e uma alternativa ao AWT e ao Swing), que é um retorno à idéia do AWT de acessar Widgets nativos por meio de Java.

skiphoppy
fonte
Um ... tendo feito um balanço bastante extenso em várias plataformas, posso dizer que não é o mesmo entre plataformas. Semelhante? Certo. Mesmo? De jeito nenhum.
Cletus
1
Os problemas de peso pesado / peso leve desaparecerão com a atualização 12 do Java 6 (consulte java.dzone.com/news/a-farewell-heavyweightlightwei ).
21411 Dan Dyer
Uau. Não acredito que eles possam consertá-lo, e ainda não acredito que a mistura de componentes leves e pesados ​​seria desejável. Mas é incrível que eles possam consertar isso.
Skiphoppy #
Apenas esqueça os dois. Dê uma olhada no WPF. :)
Alper Ozcetin
3
Aqui está um artigo oficial Java confirmando que a mistura é fixo: oracle.com/technetwork/articles/java/...
user193130
35

A diferença básica que todos já mencionaram é que um é pesado e o outro é leve . Deixe-me explicar, basicamente, o que o termo peso pesado significa é que, quando você está usando os componentes awt, o código nativo usado para obter o componente view é gerado pelo sistema operacional , por isso a aparência muda de SO para SO. Onde nos componentes oscilantes é responsabilidade da JVM gerar a visualização dos componentes. Outra declaração que eu vi é que o swing é baseado no MVC e o awt não é.

Acesso negado
fonte
14
na verdade balanço utiliza uma abordagem de modelo delegado, o qual é derivado a partir da abordagem MVC, onde no Ver e controlador são combinados para uma estrutura delegado
Purushottam
15

Swing vs AWT . Basicamente, o AWT veio em primeiro lugar e é um conjunto de componentes de interface do usuário pesados ​​(o que significa que são invólucros para objetos do sistema operacional), enquanto o Swing foi construído sobre o AWT com um conjunto mais rico de componentes leves.

Qualquer trabalho sério da interface do usuário Java é feito no Swing, não no AWT, que foi usado principalmente para applets.

cleto
fonte
1
existem casos em que o awt é mais útil / aconselhado a usar do que o swing?
Samiksha
1
Costumava ser relevante ... há 10 anos.
Bart
@Pacerier ele estava falando AWT, não SWT
11

Até onde o AWT pode ser mais útil que o Swing -

  • você pode estar segmentando uma JVM ou plataforma mais antiga que não oferece suporte ao Swing. Isso realmente entrava em jogo se você estivesse criando Applets - você queria atingir o menor denominador comum para que as pessoas não precisassem instalar um plugin Java mais recente. Não tenho certeza de qual é a versão atual mais amplamente instalada do plug-in Java - isso pode ser diferente hoje.
  • algumas pessoas preferem a aparência nativa do AWT sobre as skins da plataforma 'não estão lá' da Swing. (Existem skins com aparência nativa de terceiros melhores do que as implementações do Swing, BTW) Muitas pessoas preferiram usar o FileDialog do AWT em vez do FileChooser do Swing, porque ele forneceu o diálogo de arquivo da plataforma com o qual a maioria das pessoas estava acostumada, em vez do Swing 'estranho' personalizado.
Nate
fonte
2
Mas para o último, também podemos criar um FileChooser que se parece com o diálogo de arquivo do Windows (mas sem preenchimento automático) stackoverflow.com/q/17630055/2534090
JavaTechnical
9

Várias consequências resultam dessa diferença entre o AWT e o Swing.

O AWT é uma fina camada de código na parte superior do sistema operacional, enquanto o Swing é muito maior. Swing também tem uma funcionalidade muito mais rica. Usando o AWT, você precisa implementar várias coisas, enquanto o Swing as inclui. Para trabalhos intensivos em GUI, o AWT parece muito primitivo para trabalhar em comparação com o Swing. Como o Swing implementa a funcionalidade da GUI em si, em vez de depender do sistema operacional host, ele pode oferecer um ambiente mais rico em todas as plataformas em que o Java é executado. O AWT é mais limitado no fornecimento da mesma funcionalidade em todas as plataformas, porque nem todas as plataformas implementam os mesmos controles da mesma maneira.

Os componentes Swing são chamados de "leves" porque não precisam de um objeto SO nativo para implementar sua funcionalidade. JDialoge JFramesão pesados, porque eles têm um par. Portanto, componentes como JButton, JTextAreaetc., são leves porque não possuem um sistema operacional semelhante .

Um par é um widget fornecido pelo sistema operacional, como um objeto de botão ou um objeto de campo de entrada.

Surendra Bharadwaj
fonte
7

Balanço:

  1. Swing faz parte das classes de fundação java.
  2. Os componentes do balanço são independentes da plataforma.
  3. Os componentes do giro são leves, porque o giro fica no topo da awt.

AWT:

  1. O AWT é chamado de ferramenta de janela abstrata.
  2. Os componentes do AWT dependem da plataforma.
  3. Os componentes AWT são componentes pesados.
deepika
fonte
5
  • O componente swing fornece uma interface de usuário muito flexível, porque segue o model view controller (mvc).
  • O awt não é baseado em mvc.
  • balanço funciona mais rápido.
  • O awt não funciona mais rápido.
  • os componentes do balanço são leves.
  • componentes awt são pesados.
  • swing ocupa menos espaço de memória.
  • O awt ocupa mais espaço na memória.
  • o componente swing é independente da plataforma.
  • O awt depende da plataforma.
  • swing requer o pacote javax.swing.
  • O awt requer o pacote javax.awt.
arsh
fonte
10
Eu não acho que o swing funcione mais rápido que o AWT porque o AWT usa código nativo (o código da GUI) que já estava no sistema operacional, mas o swing cria todos os componentes do zero. Portanto, o AWT pode ser mais rápido. Você poderia me dizer qual é o seu ponto de vista ao dizer que o swing funciona mais rápido ? Obrigado.
JavaTechnical
3

AWT 1. O AWT ocupa mais espaço na memória 2. O AWT depende da plataforma 3. O AWT requer o pacote javax.awt

balanços 1. O balanço ocupa menos espaço na memória 2. O componente Swing é independente da plataforma 3. Swing requer o pacote javax.swing

B.DastagiriReddy
fonte
1
Você poderia me dizer como o AWT ocupa mais espaço na memória? Porque ele usa código nativo?
JavaTechnical
awt requer java.awt. *
abhisekp 15/02