Perché è difficile far apparire nativo un programma Java?


98

La maggior parte delle applicazioni Java non ha lo stesso aspetto delle applicazioni C / C ++. Swing potrebbe essere stato progettato apposta per avere un aspetto distinto, ma sulla base di ciò che ho letto, SWT, ad esempio, ha provato a "sembrare nativo", e non ha completamente successo.

La mia domanda è:

Perché è difficile per gli sviluppatori del linguaggio Java progettare un sistema GUI che copia esattamente l'aspetto delle GUI native? Cosa c'è di diverso nelle GUI native? Non si tratta solo di progettare pulsanti che sembrano pulsanti "nativi"? O va più in profondità?


31
perché swing scrive i suoi componenti gui che cercano di imitare il nativo, invece di creare un legame con i componenti nativi reali, nell'idea della portabilità
maniaco del cricchetto

5
Non sono un esperto di questo argomento, ma suppongo che sia solo una questione di quanto impegno i venditori di toolkit GUI sono disposti a investire per ottenere tutti i dettagli cruenti giusti. Vedi, ad esempio, il framwork C ++ "Qt" e questa domanda SO: stackoverflow.com/questions/7298441/…
Doc Brown,

4
Ci sono molti molti dettagli di cui occuparsi. Ad esempio, il modo in cui funziona il completamento automatico in una finestra di dialogo di apertura dei file è un punto in cui si è interrotta un'applicazione Java dall'aspetto nativo.
CodesInChaos

4
Swing ha un aspetto "nativo" che puoi collegare al posto di quello predefinito. Inoltre, Java prima ha provato a utilizzare roba nativa disponibile con AWT ma non ha funzionato molto bene, AFAIK a causa delle differenze intrinseche tra le piattaforme. Ecco perché hanno creato Swing, in modo che un'app Java funzioni esattamente allo stesso modo ovunque.
marczellm,

5
Non trascurare JavaFX. È la sostituzione SWING ed è di default in JDK / JRE a partire da Java 8. È molto più moderno di SWING e AWT e sembra molto più nativo su quasi tutte le piattaforme (si aggancia molto al toolkit dell'interfaccia utente nativa su ogni piattaforma). Detto questo, come altri hanno già detto, per ottenere un'applicazione esattamente nativa da un linguaggio "taglia unica" come Java, dovrai fare un po 'di lavoro. L'interfaccia utente di Java era / era / ancora-intesa come "la migliore soluzione per tutte le piattaforme" pronta all'uso.
SnakeDoc,

Risposte:


56

Non si tratta solo di progettare pulsanti che sembrano pulsanti "nativi"?

Beh, una specie di, per i pulsanti. Ma questo potrebbe essere più difficile di quanto immagini. Al giorno d'oggi la grafica utilizzata per rappresentare i componenti della GUI non è così semplice come le bitmap casuali che sono allungate (poiché non si adattano affatto molto bene) - sono spesso grafiche basate su vettori con molti casi angolari programmati al loro interno ( quindi quando il pulsante raggiunge il bordo dello schermo può apparire leggermente diverso, ad esempio.) E, naturalmente, avrai bisogno di una grafica diversa quando si fa clic su un pulsante. Per motivi di copyright, gli sviluppatori spesso non possono semplicemente usare completamente questi elementi grafici esistenti, quindi devono essere ricreati - e mentre fanno un buon lavoro per la maggior parte, inevitabilmente alcune cose si perdono, data l'enorme varietà di componenti grafici là fuori.

Sto dicendo tutto quanto sopra basato su Swing, che è ovviamente un toolkit GUI leggero e non nativo. Si menziona specificamente SWT che non sembra nativo, il che è un po 'strano, perché SWT è nativo. È un toolkit che utilizza JNI sottostante per chiamare componenti nativi - quindi se qualcosa non sembra proprio lì, non sarà a causa dell'aspetto grafico.


1
Grazie. Cosa significa esattamente "leggero"? E cosa significa in realtà "nativo"? Presumo che significhi qualcosa che utilizza risorse dal sistema operativo del computer o interagisce direttamente con esso. È vero?
user3150201,

1
@ user3150201 Certo, quindi il sistema operativo sottostante avrà una determinata quantità di pulsanti e widget che possono essere posizionati in modo nativo, ma ovviamente questi pulsanti differiranno tra sistema operativo e tra piattaforme: questi sono i componenti pesanti e nativi. I componenti leggeri non sono i componenti dettati dal sistema operativo, sono disegnati da Java (in questo caso) per apparire e comportarsi come componenti della GUI - quindi possono apparire come vuoi se metti il ​​lavoro (ma devi emulare l'aspetto della piattaforma se lo desideri, non lo ricevi gratuitamente.)
berry120,

14
Il posizionamento dei pulsanti, le dimensioni esatte e gli stili preferiti della GUI variano in base alla piattaforma e far funzionare Java per imitarli. Swing può darti il ​​pulsante nativo ma se è alto 10 pixel l'utente penserà comunque che qualcosa non funziona. Apple ha le Linee guida per l'interfaccia umana e Microsoft ha le Linee guida per l' interfaccia utente per aiutarti a ottenere l'aspetto nativo corretto. Sarà necessario modificare l'interfaccia utente in qualche modo tra le piattaforme.
Michael Shopsin

4
JavaFX appare molto più "nativo" di SWING e AWT. Ha finestre trasparenti native, ecc. Molto più moderne dall'aspetto immediato.
SnakeDoc,

2
@SnakeDoc Sembra più moderno, certo, ma non direi che sembra "nativo" - certamente non usa i componenti della GUI sottostanti della piattaforma, è tutto con skin nei CSS.
Berry120,

71

Esistono letteralmente una mezza dozzina di toolkit che potrebbero essere considerati "nativi" su alcuni sistemi. Alcuni di questi hanno concetti o capacità piuttosto unici e replicarli in un toolkit multipiattaforma è noioso. Il look & feel di un'applicazione non è determinato solo da una "skin", ma anche dal layout e da come si comporta. Alcune considerazioni:

  • In una finestra di dialogo, da quale parte appartiene il pulsante "OK" - a sinistra o a destra? Abbastanza giusto, costruiamo una finestra di dialogo separata per ciascun sistema.
  • Come contrassegniamo il pulsante predefinito su uno schermo? Colorazione del colore, carattere grassetto, ingrandimento del pulsante? Abbastanza giusto, mettiamolo in un foglio di stile.
  • Su Windows, il concetto di "Ribbon" è piuttosto nativo. Come verrebbe tradotto in Mac, dove la barra multifunzione non è comune? Abbastanza giusto, dimentichiamo il layout esatto in pixel e forniamo un'implementazione della barra degli strumenti diversa per ogni sistema.
  • La barra dei menu fa parte della finestra (Windows, facoltativamente KDE) o si trova nella parte superiore dello schermo (Mac, Unity)? Abbastanza giusto, scriviamo un'implementazione diversa per ciascun sistema, poiché abbiamo già eliminato il layout esatto per pixel
  • Come vengono visualizzati i caratteri? Più nitido possibile o liscio e antialiasing? E quale font dovrebbe essere usato? Si noti che caratteri diversi hanno metriche diverse, quindi lo stesso paragrafo reso alla stessa larghezza può avere un numero diverso di linee a seconda del carattere.
  • Lo sfondo di una finestra è un singolo colore, un'immagine o una sfumatura? Mettiamolo anche in un foglio di stile.
  • Come appaiono le barre di scorrimento? Dove sono i pulsanti - se ne hanno? Quanto sono larghi o vengono rivelati solo quando il puntatore si sposta in una determinata regione?
  • Come incorporiamo altre combinazioni di colori?
  • Cosa dovrebbe essere trascinabile? Dove sono previsti i menu di scelta rapida?

Questi problemi non possono essere risolti attraverso un semplice foglio di stile quando toccano il comportamento o il layout generale dell'applicazione. L'unica vera soluzione è riscrivere l'applicazione per ciascun sistema (ignorando così i vantaggi multipiattaforma di Java). L'unica soluzione realistica è dimenticare il layout esatto dei pixel e scrivere su un'interfaccia comune che si astragga su toolkit specifici del sistema. La soluzione adottata da Swing è emulare vari sistemi, che falliscono in modo spettacolare.

E poi c'è coerenza multipiattaforma, l'idea che la tua app possa apparire esattamente la stessa su tutti i sistemi (spesso scelta dai giochi, dove questo aumenta l'immersione). Sulle applicazioni desktop, questo è solo fastidioso e rompe le aspettative degli utenti.


1
+1. Solo una cosa che vorrei aggiungere: che dire delle cose che il sistema consente all'utente di configurare, partendo da dettagli "semplici" come come aprire i menu di scelta rapida? (E preferirei di gran lunga che i programmi Windows non avessero nastri e app per Mac, grazie. Sì, è necessario progettare buone GUI per sistema operativo.)
Christopher Creutzig

@ChristopherCreutzig Ecco da dove proviene la mia esperienza: sul mio desktop principale, utilizzo KDE su Linux (entrambi configurabili autonomamente) e utilizzo QtCurve per modificare l'aspetto delle applicazioni. Questi stili speciali funzionano perfettamente nelle applicazioni di punta di KDE. Le app GTK ben scritte possono utilizzare un livello di compatibilità, ma mancano i gradienti di sfondo, la barra dei menu rimane all'interno della finestra ecc. Ma poi inizia rapidamente a deteriorarsi, con i programmi che prendono alcuni widget dallo stile del sistema (come le barre di scorrimento) , ma ignorandone altri (come il rendering dei caratteri o le ombre attorno ai menu)
amon

+1 perché ci sono alcuni punti forti in questa risposta, ma ci sono anche alcuni punti deboli. Qualsiasi problema "in che modo questo gestore di finestre disegna X" viene gestito utilizzando l'API nativa. Ad esempio, X11 su OS X può disegnare finestre, pulsanti, barre di scorrimento, finestre di dialogo, OS X nativi, quindi molti di questi problemi scompaiono. La vera risposta è ciò che @TheSpooniest ha detto di seguito: UX è molto più di un semplice disegno di widget. Spaziatura, tempistica, animazione, accelerazione del mouse, input tocco ... c'è un mondo di dettagli sottili che sono molto costosi da riprodurre con un toolkit multipiattaforma.
Mark E. Haase,

13

Sì, va più in profondità.

Costruire un pulsante che assomiglia a un pulsante Windows o OS X è facile, quando si crea solo questo pulsante. Ma il pulsante deve "comportarsi" come quelli originali, il che potrebbe non essere facile: forse c'è più spazio in una versione disponibile, ma non nell'altra, forse il colore è più adatto al tuo design nella versione di Windows, ecc.

Ciò viene escluso quando hai un'intera GUI: un programma OS X presenta il suo contenuto in modo diverso rispetto a un programma Windows. Questo è quasi impossibile da catturare in una GUI: sarebbero necessarie due GUI, ma non molte applicazioni fanno così tante storie. Invece mirano a "sembrare ok sulla maggior parte dei sistemi" - questo sembra ancora un po 'estraneo, ma è utilizzabile e molto più facile da sviluppare.


9

Non è difficile creare un pulsante che assomigli a un pulsante OSX, a un pulsante Windows o a quello di qualsiasi altro toolkit. Ma le linee guida dell'interfaccia utente per la maggior parte degli ambienti non sono così semplici come le basi di "questo è l'aspetto di un pulsante". Esistono molte differenze più sottili, dalla spaziatura tra gli elementi dell'interfaccia utente all'ordine in cui alcune azioni ben note dovrebbero apparire in un elenco all'esatta posizione della finestra di dialogo Preferenze / Opzioni nel sistema di menu. Si possono automatizzare i casi più comuni per interfacce utente molto semplici, ma molte attività della UI, se non la maggior parte, richiedono un tocco molto più fine.

SWT ha provato ad automatizzarlo in una certa misura e, ancora una volta, lo fa bene per semplici attività dell'interfaccia utente. Ma non esiste una soluzione unica per tutti, e quindi quando le interfacce utente diventano più complesse, i metodi di base che utilizza iniziano a cadere a pezzi. È generalmente possibile riportarlo in linea con un accurato lavoro di interfaccia utente manuale, ma questo non è qualcosa che la maggior parte dei programmatori è in grado o è disposto a fare per tutte le piattaforme.

L'approccio di Swing a questo era semplicemente quello di evitare i toolkit nativi ogni volta che fosse possibile. Non è nativo e non cerca di essere: invece, cerca di creare qualcosa che sembrerà (quasi) lo stesso, indipendentemente da dove viene eseguito. Invece di provare (inutilmente) a piacere a tutti, ha provato a piacere a se stesso, e mentre ci è riuscito, ci si può chiedere quanto sia efficace il risultato per la più ampia comunità di utenti.


7

C'è un compromesso tra l'aspettarsi che l'applicazione appaia il più naturale possibile su ogni sistema e che si aspetti che l'applicazione funzioni allo stesso modo su ciascun sistema. Non esiste una scelta "giusta".

Inoltre, anche se scegli il lato "dall'aspetto naturale", potresti voler proteggere gli utenti del tuo toolkit grafico da "miglioramenti" nei componenti e nell'API nativi sottostanti che potrebbero interrompere inaspettatamente la loro applicazione.

Questo è il motivo per cui alcuni sviluppatori di toolkit GUI preferiscono fornire i propri componenti che imitano quelli nativi, ma forniscono la propria implementazione. D'altra parte, sviluppare un toolkit GUI funzionalmente completo è uno sforzo significativo e considerazioni economiche possono portare a tagliare alcuni spigoli.

Si noti che questo problema non è specifico di Java, ma è affrontato da ogni azienda che produce toolkit indipendenti dalla piattaforma.


Invece di effettuare un downvoting silenzioso, farebbe un servizio maggiore alla comunità spiegando cosa ritieni sbagliato con una risposta. A meno che non sia solo un problema personale ...
Nicola Musatti,

4

È tutto dovuto alla storia.

Sun desiderava che tutto il software Java funzionasse allo stesso modo su tutte le macchine.

Affinché il software "appaia nativo" deve funzionare allo stesso modo di altri software su un determinato sistema operativo.

Sun ha fatto tutto il possibile per rendere difficile la scrittura di software Java integrato con un sistema operativo, poiché qualsiasi integrazione con un sistema operativo avrebbe fatto funzionare il software in modo diverso su ciascun sistema operativo.

In questi giorni pochissimi programmatori Java si preoccupano di qualcosa di diverso dal software basato su web server.

Sun ha ucciso Java sul desktop bloccando tutti i programmatori che utilizzavano i sistemi basati su Microsoft Java, facendo apparire brutto qualsiasi programmatore che scelse Java all'inizio.

Chiunque scriva software desktop che si preoccupa di "apparire nativo" ha imparato molto tempo fa a non usare Java e ha le proprie opinioni rafforzate ogni volta che usano qualsiasi software Oracle.

Pertanto in questi giorni non c'è richiesta di "apparire nativi" sul software desktop da programmatori Java.


5
"Sun ha fatto tutto ciò che era in suo potere per rendere difficile la scrittura di software Java integrato con un sistema operativo", ha sbagliato. Semplicemente non hanno fatto grandi sforzi per renderlo facile. "Sun ha ucciso Java sul desktop mandando in errore tutti i programmatori che utilizzavano i sistemi basati su Microsoft Java", la reciproca inimicizia tra Microsoft e Sun ha portato Microsoft a creare una versione delle librerie AWT che non era compatibile con i requisiti di Sun, causando il famigerato Cause legali di Sun / MS.
jwenting

1
@jwenting, Sun si preoccupava di più di creare problemi per Microsoft, piuttosto che per i programmatori che avevano scelto di utilizzare il sistema basato su Java di Microsoft. Quindi ho rinunciato a Jave e ho continuato con MFC fino a quando non è uscito C #.
Ian,

3
forse alcune persone al Sun, ma quel sentimento era reciproco. Se stai sviluppando esclusivamente per una singola piattaforma, uno strumento nativo per quella piattaforma è SEMPRE l'opzione preferita, questo non ha nulla a che fare con la politica aziendale. Se scegli i tuoi strumenti in base a "I odio Sun" o "Odio Microsoft", ciò si riflette molto male sul tuo atteggiamento professionale. Ho usato principalmente Java, ma a parte quello ho anche usato Delphi, C #, Ruby, C ++, C, Progress, qualunque fosse la migliore per il lavoro da svolgere. E molto spesso finirà per essere una soluzione ibrida.
jwenting

3

Quello che pensi è in nativerealtà app native che fanno le proprie cose mentre i toolkit come SWT seguono gli standard pubblicati per l'interfaccia utente di quel sistema operativo. Il problema è che nessuno crea app seguendo questi standard, quindi quando si avvia un'app Java. Sembra non essere nativo. Ad esempio, quasi tutti i progetti di Microsoft (Office, Outlook, ecc.) Non possono essere riprodotti visivamente utilizzando i controlli standard di Windows.

Andrà anche peggio quando Microsoft e Apple aggiungeranno funzionalità UI dinamiche alle loro piattaforme OS. Consentire agli sviluppatori di skin / style le loro app allo stesso modo in cui i web design creano stili per i siti Web.

Java sulla piattaforma Android sta seguendo questo percorso. Rendere gli elementi dell'interfaccia utente per Android definiti in XML con stili personalizzabili.

Java non è mai stato molto popolare come piattaforma desktop. Di conseguenza, questi cambiamenti nel settore non si stanno propagando ai runtime del desktop. Non ci sono abbastanza sviluppatori disposti a dedicare tempo per risolvere il problema.


1
+1, nell'era di Windows 95 c'era un aspetto "standard" per i controlli di Windows. Adesso non tanto.
GrandmasterB,

Sì, sono passati alcuni anni da quando ho programmato desktop ma sono rimasto sorpreso dal fatto che .NET non avesse un controllo stile nastro nonostante diventasse parte integrante del software di produttività costruito da MS.
Rig

@Rig Da NET 4.0 esiste un buon controllo Ribbon nativo in .NET. Ecco un buon articolo: c-sharpcorner.com/UploadFile/0b73e1/ribbon-control-in-wpf-4-5
Christian Sauer

1
@Rig Avrai bisogno di .NET 4.5, non di .NET 4. Visual Studio 2010 può solo targetizzare fino a 4; avrai bisogno di VS2012 o più recente come target 4.5. Posso vederlo quando ho scelto come target 4.5 in VS2013, ma non quando cambio la versione di destinazione in 4.
Bob

1
@Rig È possibile utilizzare la barra multifunzione in Net 4.0: è possibile scaricarla da Microsoft e quindi verrà visualizzata: 10rem.net/blog/2010/10/22/wpf-ribbon-october-release (Non sono sicuro se questo è l'ultima versione). Meglio scaricarlo da Nuget. Ho dovuto farlo per un programma che doveva funzionare su Windows XP - funziona benissimo ed è per lo più compatibile con la variante Net 4.5, quindi puoi strappare la cosa 4.0 quando XP finalmente si ritira.
Christian Sauer,

-1

Quale sistema operativo vuoi sembrare anche "nativo"?

Non puoi essere nativo di tutti loro il 100% delle volte.

SWT ecc. Sono l'approccio migliore per apparire come nativi di tutti loro come si arriva quando è necessario raggiungere un compromesso .

E infatti, questo compromesso inizia a diventare sempre più difficile da raggiungere; non tanto a causa dei sistemi operativi, ma a causa dei dispositivi di input. Per i touchscreen, devi effettivamente progettare diversamente, perché non esiste un pulsante destro del mouse. Pertanto, è necessario disporre della stessa funzionalità altrimenti.

Non ci sarà mai un pulsante magico che sposta la funzionalità "intuitivamente" dal pulsante destro del mouse ai guest, senza che tu specifichi ogni aspetto dettagliato per ogni singolo dispositivo di input (a quel punto, sei nativo di ogni piattaforma che hai considerato, ma comunque non -nativo a nessuno che non hai considerato).


-2

Davvero una bella domanda. Mi sono sempre chiesto a me stesso per alcuni anni successivi in ​​passato, ho pensato che ci fosse una ragione legittima dietro questo, ma in realtà non lo è.

Penso che la risposta sia piuttosto semplice e molte risposte non stanno davvero scavando nel problema.

Se la tua lingua consente di disegnare piexel sullo schermo, è possibile creare al 100% un framework gui basato su di esso che imiterà l'aspetto e il controllo dei moduli di Windows con precisione.

Poiché Java è multipiattaforma, è anche del tutto possibile assicurarsi che, in base all'interfaccia utente del tipo di sistema in esecuzione (Mac / Windows), sceglierebbe di apparire diverso su entrambe le piattaforme, adattandosi allo stile della piattaforma di runtime.

Come puoi vedere in XAML, ad esempio, l'interfaccia utente può essere facilmente presentata in forma e linguaggio molto strutturati. La scelta dei comportamenti "nativi" è anche possibile se si impiega del tempo per farlo.

Quindi sarebbe possibile creare un framework GUI che consentirebbe agli sviluppatori Java di ottenere applicazioni che sembrerebbero native su Mac e Windows.

Quindi arriviamo a Swing, questo è solo un framework GUI dal potenziale infinito di framework GUI che potrebbe essere creato per Java. Si comporta come è stato programmato, il che non segue il processo sopra descritto e ottieni app dall'aspetto strano su entrambi i sistemi. Questa è la scelta fatta dagli sviluppatori di Swing, nessuno li ha costretti a fare questo e comportarsi in quel modo.


2
questo non risponde alla domanda, Asker ha già trattato questo punto: "Swing potrebbe essere stato progettato apposta per avere un aspetto distintivo"
moscerino

Non sono d'accordo, ma grazie per aver commentato il tuo
segno
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.