Por que é difícil fazer um programa Java 'parecer nativo'?

98

A maioria dos aplicativos Java não tem a mesma aparência que os aplicativos C / C ++. O swing pode ter sido projetado propositadamente para ter uma aparência distinta, mas, com base no que li, o SWT, por exemplo, tentou 'parecer nativo' e não foi totalmente bem-sucedido.

Minha pergunta é:

Por que é difícil para os desenvolvedores da linguagem Java projetar um sistema de GUI que copia exatamente a aparência das GUIs nativas? O que há de diferente nas GUIs nativas? Não é apenas uma questão de criar botões que se pareçam com botões 'nativos'? Ou vai mais fundo que isso?

user3150201
fonte
31
porque balanço escreve seus próprios componentes gui que tentam imitar o nativo, em vez de criar uma ligação aos componentes nativos reais, na idéia de portabilidade
catraca aberração
5
Não sou especialista neste tópico, mas acho que é apenas uma questão de quanto esforço os fornecedores de kits de ferramentas da GUI estão dispostos a investir para obter todos os detalhes corretos. Veja, por exemplo, o framework C ++ "Qt" e esta pergunta do SO: stackoverflow.com/questions/7298441/…
Doc Brown
4
Existem muitos detalhes para cuidar. Por exemplo, a maneira como a conclusão automática funciona em um diálogo de abertura de arquivo é um ponto em que um aplicativo java de aparência nativa foi interrompido.
CodesInChaos
4
O Swing tem uma aparência "semelhante nativa" que você pode conectar em vez do padrão. Além disso, o Java tentou primeiro usar o material nativo disponível com o AWT, mas não funcionou muito bem, o AFAIK, devido às diferenças inerentes entre as plataformas. É por isso que eles criaram o Swing, para que um aplicativo Java funcione exatamente da mesma maneira em todos os lugares.
Marczellm
5
Não negligencie o JavaFX. É a substituição do SWING e está no JDK / JRE por padrão, começando no Java 8. É muito mais moderno que SWING e AWT e parece muito mais nativo em praticamente todas as plataformas (ele se encaixa muito no kit de ferramentas da UI nativa em cada plataforma). Com isso dito, como outros mencionaram, para obter um aplicativo exatamente nativo de uma linguagem "tamanho único" como Java, você terá que fazer algum trabalho. As UIs de Java eram / eram / ainda pretendem ser uma "melhor opção para todas as plataformas" pronta para uso.
SnakeDoc

Respostas:

56

Não é apenas uma questão de criar botões que se pareçam com botões 'nativos'?

Bem - mais ou menos, para botões. Mas isso pode ser mais difícil do que você imagina. Atualmente, os gráficos usados ​​para representar os componentes da GUI não são tão simples quanto os bitmaps aleatórios que são esticados (já que não são muito bem dimensionados) - geralmente são gráficos baseados em vetores com muitos casos de canto programados neles ( portanto, quando o botão atinge a borda da tela, pode parecer um pouco diferente, por exemplo.) E, é claro, você precisará de gráficos diferentes quando um botão for clicado. Por motivos de direitos autorais, os desenvolvedores geralmente não podem simplesmente usar esses gráficos existentes, então eles precisam ser recriados - e, embora façam um bom trabalho na maioria das vezes, inevitavelmente algumas coisas são perdidas, dada a enorme variedade de componentes gráficos existentes.

Estou dizendo tudo isso com base no Swing, que é obviamente um kit de ferramentas da GUI leve e não nativo. Você mencionou especificamente que o SWT não parece nativo, o que é um pouco estranho, porque o SWT é nativo. É um kit de ferramentas que usa a JNI abaixo para chamar componentes nativos - portanto, se algo não parecer bem ali, não será por causa da aparência.

berry120
fonte
1
Obrigado. O que significa 'peso leve' exatamente? E o que 'nativo' realmente significa? Presumo que isso signifique algo que utiliza recursos do sistema operacional do computador ou interage diretamente com ele. Isso é verdade?
user3150201
1
@ user3150201 Claro, o SO subjacente terá uma quantidade definida de botões e widgets que podem ser colocados de forma nativa, mas obviamente esses botões diferirão entre SO e entre plataformas - esses são os componentes nativos pesados. Componentes leves não são os ditados pelo sistema operacional; eles são atraídos pelo Java (neste caso) para parecer e se comportar como componentes da GUI - para que possam ser da maneira que você quiser se você colocar o trabalho (mas você deve emular o olhar plataforma e sentir se você quer isso, você não obtê-lo gratuitamente).
berry120
14
A colocação de botões, tamanhos exatos e estilos preferidos da GUI varia de acordo com a plataforma, e fazer o Java imitá-los exige trabalho. O Swing pode fornecer o botão nativo, mas se tiver 10 pixels de altura, o usuário ainda pensará que algo está errado. A Apple possui as Diretrizes da interface humana e a Microsoft as Diretrizes da interface do usuário para ajudá-lo a obter a aparência nativa correta. Você precisará alterar a interface do usuário um pouco entre as plataformas.
Michael Shopsin
4
JavaFX parece muito mais "nativo" que SWING e AWT. Possui janelas transparentes nativas, etc. Aparência muito mais moderna e pronta para uso.
SnakeDoc
2
@SnakeDoc Parece mais moderno, com certeza, mas eu não diria que parece "nativo" - ele certamente não usa os componentes GUI subjacentes da plataforma, tudo é apresentado em CSS.
precisa saber é o seguinte
71

Há literalmente meia dúzia de kits de ferramentas que podem ser considerados "nativos" em algum sistema. Alguns deles têm conceitos ou recursos bastante exclusivos, e replicá-los em um kit de ferramentas de plataforma cruzada é entediante. A aparência de um aplicativo não é apenas determinada por uma "capa", mas também no layout e como ele se comporta. Algumas considerações:

  • Em uma caixa de diálogo, de que lado o botão "OK" pertence - à esquerda ou à direita? Justo, vamos criar um diálogo separado para cada sistema.
  • Como marcamos o botão padrão em uma tela? Tingimento de cores, fonte em negrito, ampliando o botão? É justo, vamos colocar isso em uma folha de estilo.
  • No Windows, o conceito "Faixa de opções" é bastante nativo. Como isso seria traduzido para o Mac, onde a fita não é comum? É justo, vamos esquecer o layout exato do pixel e fornecer uma implementação de barra de ferramentas diferente para cada sistema.
  • A barra de menus faz parte da janela (Windows, opcionalmente KDE) ou fica na parte superior da tela (Mac, Unity)? Justo, vamos escrever uma implementação diferente para cada sistema, pois já jogamos fora o layout exato de pixels
  • Como as fontes são renderizadas? O mais nítido possível, ou suave e antialias? E qual fonte deve ser usada? Observe que fontes diferentes têm métricas diferentes; portanto, o mesmo parágrafo renderizado na mesma largura pode ter um número diferente de linhas, dependendo da fonte.
  • O plano de fundo de uma janela é de uma única cor, imagem ou gradiente? Vamos colocar isso em uma folha de estilo também.
  • Como são as barras de rolagem? Onde estão os botões - se houver algum? Qual a largura ou são reveladas apenas quando o ponteiro se move para uma determinada região?
  • Como incorporamos outros esquemas de cores?
  • O que é esperado ser arrastável? Onde são esperados os menus de contexto?

Esses problemas não podem ser resolvidos por meio de uma folha de estilo simples quando eles tocam no comportamento ou no layout geral do aplicativo. A única solução real é reescrever o aplicativo para cada sistema (ignorando os benefícios de plataforma cruzada do Java). A única solução realista é esquecer o layout exato do pixel e escrever em uma interface comum que abstraia sobre kits de ferramentas específicos do sistema. A solução adotada pela Swing é emular vários sistemas, que falham espetacularmente.

E existe a consistência entre plataformas, a ideia de que seu aplicativo pode ter a mesma aparência em todos os sistemas (geralmente escolhido por jogos, onde isso aumenta a imersão). Em aplicativos de desktop, isso é apenas irritante e quebra as expectativas do usuário.

amon
fonte
1
+1. Gostaria de acrescentar apenas uma coisa: o que o sistema permite que o usuário configure, começando com detalhes "simples", como abrir menus de contexto? (E eu prefiro muito mais programas do Windows para ter fitas e aplicações Mac não, obrigado Sim, boas GUIs devem ser concebidos por OS..)
Christopher Creutzig
@ChristopherCreutzig É daí que vem a minha experiência: Na minha área de trabalho principal, eu uso o KDE no Linux (ambos são muito configuráveis) e uso o QtCurve para ajustar a aparência dos aplicativos. Esses estilos especiais funcionam bem nos aplicativos principais do KDE. Aplicativos GTK bem escritos podem fazer uso de uma camada de compatibilidade, mas faltam gradientes de fundo, a barra de menus fica dentro da janela etc. , mas ignorando outras pessoas (como renderização de fonte ou sombras nos menus)
amon
+1 porque existem alguns pontos fortes nesta resposta, mas também existem alguns pontos fracos. Qualquer problema "como esse gerenciador de janelas desenha X" é tratado usando a API nativa. Por exemplo, o X11 no OS X pode desenhar janelas, botões, barras de rolagem, caixas de diálogo, etc. do OS X nativos. Muitos desses problemas desaparecem. A resposta real é o que @TheSpooniest disse abaixo: UX é muito mais do que apenas desenhar widgets. Espaçamento, tempo, animação, aceleração do mouse, entradas por toque ... há um mundo de detalhes sutis que são muito caros de reproduzir com um kit de ferramentas de plataforma cruzada.
Mark E. Haase
13

Sim, isso vai mais fundo.

Criar um botão parecido com um botão do Windows ou OS X é fácil quando você está criando apenas esse botão. Mas o botão deve "se comportar" como os originais, o que pode não ser fácil: talvez exista mais espaço em uma versão disponível, mas não na outra, talvez a cor seja mais adequada ao seu design na versão para Windows, etc.

Isso ocorre quando você tem uma GUI inteira: um programa OS X apresenta seu conteúdo de maneira diferente de um programa Windows. Isso é quase impossível de capturar em uma GUI - você precisaria de duas GUIs, mas não há muitos aplicativos que fazem tanto barulho. Em vez disso, eles visam "parece bom na maioria dos sistemas" - isso ainda parece um pouco estranho, mas é utilizável e muito mais fácil de desenvolver.

Christian Sauer
fonte
9

Não é difícil criar um botão que se pareça com um botão OSX, Windows ou qualquer outro kit de ferramentas. Mas as diretrizes de interface do usuário para a maioria dos ambientes não são tão simples quanto os conceitos básicos de "é assim que um botão se parece". Existem muitas diferenças mais sutis, desde o espaçamento entre os elementos da interface do usuário até a ordem em que determinadas ações conhecidas devem aparecer em uma lista até a posição exata da caixa de diálogo Preferências / Opções no sistema de menus. Pode-se automatizar os casos mais comuns para interfaces de usuário muito simples, mas muitas, se não a maioria das tarefas da interface do usuário, exigem um toque muito mais refinado.

O SWT tentou automatizar isso até certo ponto e, mais uma vez, ele acertou em tarefas simples da interface do usuário. Mas não existe uma solução única para todos, e, quando as UIs se tornam mais complexas, os métodos básicos que ela usa começam a desmoronar. Geralmente, é possível trazê-lo de volta ao trabalho manual minucioso da interface do usuário, mas isso não é algo que a maioria dos programadores pode ou deseja fazer para todas as plataformas.

A abordagem de Swing para isso foi simplesmente evitar kits de ferramentas nativos sempre que possível. Não é nativo e nem tenta ser: em vez disso, tenta criar algo que parecerá (quase) o mesmo, não importa onde seja executado. Em vez de tentar (inutilmente) agradar a todos, ele tentou agradar a si mesmo e, embora tenha sido bem-sucedido, pode-se questionar a eficácia do resultado para a comunidade mais ampla de usuários.

The Spooniest
fonte
7

Há uma troca entre esperar que seu aplicativo pareça o mais natural possível em todos os sistemas e esperar que seu aplicativo funcione da mesma maneira em cada sistema. Não existe uma escolha "certa".

Além disso, mesmo se você escolher o lado "aparência natural", convém proteger os usuários do seu kit de ferramentas gráficas contra "melhorias" nos componentes nativos subjacentes e na API, que podem interromper seu aplicativo inesperadamente.

É por isso que alguns desenvolvedores de kit de ferramentas da GUI preferem fornecer seus próprios componentes que imitam os nativos, mas fornecem sua própria implementação. Por outro lado, desenvolver um kit de ferramentas GUI funcionalmente completo é um esforço significativo e considerações econômicas podem levar a algumas arestas.

Observe que esse problema não é específico de Java, mas é enfrentado por todas as empresas que produzem kits de ferramentas independentes de plataforma.

Nicola Musatti
fonte
Em vez de fazer uma votação silenciosa, você prestaria um serviço maior à comunidade, explicando o que acha errado com uma resposta. A menos que seja apenas uma questão pessoal ...
Nicola Musatti
4

É tudo devido à história.

A Sun desejou que todo software Java funcionasse da mesma maneira em todas as máquinas.

Para que o software “pareça nativo”, ele deve funcionar da mesma forma que outros softwares no sistema operacional fornecido.

A Sun fez tudo o que estava ao seu alcance para dificultar a criação de software Java integrado a um sistema operacional, pois qualquer integração com um sistema operacional faria o software funcionar de maneira diferente em cada sistema operacional.

Atualmente, pouquíssimos programadores Java se preocupam com nada além de software baseado em servidor da web.

A Sun matou o Java no desktop alterando todos os programadores que usavam os sistemas baseados em Java da Microsoft, fazendo com que qualquer programador que escolhesse Java nos primeiros dias parecesse ruim.

Qualquer pessoa que escreve um software de desktop que se preocupa com "parecer nativo" aprendeu há muito tempo a não usar Java e tem seus pontos de vista reforçados toda vez que usa qualquer software Oracle.

Portanto, atualmente, não há demanda para “parecer nativo” no software de desktop dos programadores Java.

Ian
fonte
5
"A Sun fez tudo o que estava ao seu alcance para dificultar a gravação de um software java integrado a um sistema operacional", errado. Eles simplesmente não fazem muito esforço para facilitar. "A Sun matou o Java na área de trabalho alterando todos os programadores que usavam os sistemas baseados em java da Microsoft". A inimizade mútua entre a Microsoft e a Sun levou a Microsoft a criar uma versão das bibliotecas AWT que não era compatível com os requisitos da Sun, causando o infame Processos da Sun / MS.
Jwenting
1
@jwenting, a Sun se preocupou mais em criar problemas para a Microsoft do que em programadores que escolheram usar o sistema baseado em java da Microsoft. Por isso, desisti do Jave e continuei no MFC até o C # sair.
lan
3
talvez algumas pessoas na Sun, mas esse sentimento era mútuo. Se você está desenvolvendo exclusivamente para uma única plataforma, uma ferramenta nativa para essa plataforma é SEMPRE a opção preferida, isso não tem nada a ver com a política corporativa. Se você escolher suas ferramentas com base em "Eu odeio a Sun" ou "Eu odeio a Microsoft", isso reflete muito mal em sua atitude profissional. Eu usei principalmente Java, mas, além disso, também usei Delphi, C #, Ruby, C ++, C, Progress, qualquer que fosse o melhor para o trabalho em questão. E, na maioria das vezes, isso acabará sendo uma solução híbrida.
Jwenting
3

nativeNa verdade, o que você pensa é que aplicativos nativos estão fazendo suas próprias coisas, enquanto kits de ferramentas como o SWT seguem os padrões publicados para a interface do usuário desse sistema operacional. O problema é que ninguém cria aplicativos seguindo esses padrões; portanto, quando você inicia um aplicativo Java. Parece não ser nativo. Como exemplo, quase todos os projetos da Microsoft (Office, Outlook etc.) não podem ser reproduzidos visualmente usando os controles padrão do Windows.

Vai ficar ainda pior, pois a Microsoft e a Apple adicionam recursos dinâmicos da interface do usuário às suas plataformas de sistema operacional. Permitir que os desenvolvedores criem / estilizem seus aplicativos da mesma maneira que os designs da web criam estilos para os sites.

O Java na plataforma Android está seguindo esse caminho. Tornando os elementos da interface do usuário para Android definidos em XML com estilos de skinnable.

Java nunca foi tão popular como plataforma de desktop. Como resultado, essas mudanças no setor não estão se propagando para os tempos de execução da área de trabalho. Simplesmente não há desenvolvedores suficientes dispostos a gastar tempo para corrigir o problema.

Reactgular
fonte
1
+1, na era do Windows 95, havia uma aparência 'padrão' para os controles do Windows. Agora, nem tanto.
GrandmasterB
Sim, já faz alguns anos desde que eu programei a área de trabalho, mas fiquei surpreso que o .NET não tenha sido fornecido com um controle de estilo de faixa de opções, apesar de se tornar parte integrante do software de produtividade criado pela MS.
Rig
@Rig Desde o NET 4.0, existe um bom controle nativo da faixa de opções no .NET. Aqui está um bom artigo: c-sharpcorner.com/UploadFile/0b73e1/ribbon-control-in-wpf-4-5
Christian Sauer
1
@Rig Você precisará do .NET 4.5, não do .NET 4. O Visual Studio 2010 pode segmentar apenas até 4; você precisará do VS2012 ou mais recente para segmentar o 4.5. Eu posso ver isso quando o direcionamento 4,5 no VS2013, mas não quando eu mudar a versão de destino a 4.
Bob
1
@Rig É possível usar a Faixa de Opções no Net 4.0 - você pode baixá-la da Microsoft e ela aparecerá: 10rem.net/blog/2010/10/22/wpf-ribbon-october-release (Não tenho certeza se isso é a versão mais recente). Melhor baixá-lo do Nuget. Eu tive que fazer isso em um programa que tinha que rodar no Windows XP - funciona bem e é principalmente compatível com a variante Net 4.5, para que você possa remover a versão 4.0 quando o XP finalmente se aposentar.
Christian Sauer
-1

Qual sistema operacional você deseja que pareça "nativo" também?

Você simplesmente não pode ser nativo de todos eles 100% do tempo.

O SWT, etc., é a melhor abordagem de esforço para parecer o mais nativo possível para todos eles, quando você precisa alcançar algum compromisso .

E, de fato, esse compromisso começa a se tornar cada vez mais difícil de alcançar; não tanto por causa dos sistemas operacionais, mas por causa dos dispositivos de entrada. Para telas sensíveis ao toque, você realmente precisa criar um design diferente, porque não há um botão direito do mouse. Portanto, você precisa acomodar a mesma funcionalidade caso contrário.

Nunca haverá um botão mágico que mova a funcionalidade "intuitivamente" do botão direito do mouse para as acomodações, sem que você especifique todos os aspectos detalhados de cada dispositivo de entrada (nesse ponto, você é nativo de todas as plataformas que você considerou, mas, no entanto, não -nativo para qualquer um que você não tenha considerado).

Anony-Mousse
fonte
-2

Realmente boa pergunta. Eu sempre me perguntei sobre isso por alguns anos subseqüentes no passado, pensei que havia alguma razão legítima por trás disso, mas realmente não existe.

Penso que a resposta é bastante simples, e muitas respostas não estão realmente a aprofundar a questão.

Se o seu idioma permite desenhar o piexel na tela, é 100% possível criar uma estrutura de GUI baseada nela, que imitará a aparência e a sensação dos controles de formulário do Windows com precisão.

Como o Java é multiplataforma, também é inteiramente possível garantir que, com base no tipo de sistema em execução real (Mac / Windows), a interface do usuário opte por parecer diferente nas duas plataformas, correspondendo ao estilo da plataforma de tempo de execução.

Como você pode ver no XAML, por exemplo, a interface do usuário pode ser facilmente apresentada em forma e linguagem muito estruturada. A escolha dos comportamentos "nativos" também é possível se houver tempo para fazer isso.

Portanto, seria possível criar uma estrutura de GUI que permitisse aos desenvolvedores Java obter aplicativos que pareciam nativos no Mac e no Windows.

Então, chegamos ao Swing, que é apenas uma estrutura de GUI do potencial infinito de estruturas de GUI que pode ser criada para Java. Ele se comporta como foi programado, o que não segue o processo acima e você obtém aplicativos de aparência estranha nos dois sistemas. Essa é a escolha feita pelos desenvolvedores do Swing, ninguém os forçou a fazer isso e a se comportar dessa maneira.

Valentin Kuzub
fonte
2
isso não responde à pergunta, o autor da pergunta já abordou este ponto: "O balanço pode ter sido projetado de propósito para ter uma aparência distinta"
gnat
Eu discordo, mas obrigado por comentar o seu menos (?)
Valentin Kuzub