Większość aplikacji Java nie wygląda tak samo jak aplikacje C / C ++. Swing mógł zostać zaprojektowany specjalnie, aby mieć wyjątkowy wygląd, ale na podstawie tego, co przeczytałem, SWT na przykład próbował „wyglądać na rodzimego” i nie do końca się udaje.
Moje pytanie brzmi:
Dlaczego twórcom języka Java trudno jest zaprojektować system GUI, który dokładnie kopiuje wygląd natywnych GUI? Czym różnią się natywne interfejsy GUI? Czy nie chodzi tylko o zaprojektowanie przycisków, które wyglądają jak przyciski „rodzime”? Czy może idzie to głębiej?
Odpowiedzi:
Cóż - coś w rodzaju przycisków. Ale może to być trudniejsze niż można sobie wyobrazić. Obecnie grafika używana do reprezentowania komponentów GUI nie jest tak prosta jak losowe bitmapy, które są rozciągane (ponieważ wcale nie są zbyt dobrze skalowane) - często są to grafiki wektorowe z zaprogramowanymi wieloma przypadkami narożnymi ( więc kiedy przycisk osiągnie krawędź ekranu, może na przykład wyglądać nieco inaczej.) I oczywiście, będziesz potrzebować innej grafiki po kliknięciu przycisku. Z powodów związanych z prawami autorskimi programiści często nie mogą po prostu użyć tej istniejącej grafiki, więc trzeba je odtworzyć - i chociaż wykonują dobrą robotę w przeważającej części, nieuchronnie pewne rzeczy są pomijane, biorąc pod uwagę ogromną gamę komponentów graficznych.
Mówię wszystko powyższe w oparciu o Swing, który jest oczywiście lekkim, nienatywnym zestawem GUI. W szczególności wspominasz, że SWT nie wygląda na natywny, co jest nieco dziwne, ponieważ SWT jest natywny. Jest to zestaw narzędzi, który używa JNI pod spodem do wywoływania komponentów natywnych - więc jeśli coś tam nie wygląda, to nie będzie tak z powodu wyglądu.
źródło
Istnieje dosłownie pół tuzina zestawów narzędzi, które można by uznać za „natywne” w niektórych systemach. Niektóre z nich mają raczej unikalne koncepcje lub możliwości, a ich replikacja w wieloplatformowym zestawie narzędzi jest żmudna. Wygląd aplikacji zależy nie tylko od „skóry”, ale również od układu i sposobu jej działania. Niektóre uwagi:
Tych problemów nie można rozwiązać za pomocą prostego arkusza stylów, gdy dotyczą zachowania lub ogólnego układu aplikacji. Jedynym prawdziwym rozwiązaniem jest ponowne napisanie aplikacji dla każdego systemu (ignorując w ten sposób korzyści płynące z platformy Java dla wielu platform). Jedynym realistycznym rozwiązaniem jest zapomnienie o układzie z dokładnością do pikseli i napisanie do wspólnego interfejsu, który jest abstrakcyjny w stosunku do zestawów narzędzi specyficznych dla systemu. Rozwiązaniem zastosowanym przez Swing jest emulacja różnych systemów, co zawodzi spektakularnie.
A potem jest spójność między platformami, pomysł, że Twoja aplikacja może wyglądać dokładnie tak samo na wszystkich systemach (często wybieranych przez gry, w których zwiększa to zanurzenie). W przypadku aplikacji komputerowych jest to po prostu denerwujące i łamie oczekiwania użytkowników.
źródło
Tak, idzie głębiej.
Zbudowanie przycisku, który wygląda jak przycisk systemu Windows lub OS X, jest łatwe, jeśli budujesz tylko ten przycisk. Ale przycisk musi „zachowywać się” jak oryginalne, co może nie być łatwe: może w jednej wersji jest więcej miejsca, ale nie w drugiej, może kolor bardziej pasuje do twojego projektu w wersji Windows itp.
Jest to rozgałęzione, gdy masz cały GUI: program OS X prezentuje swoją zawartość inaczej niż program Windows. Jest to prawie niemożliwe do uchwycenia w jednym GUI - potrzebujesz dwóch GUI, ale niewiele aplikacji sprawia tyle problemów. Zamiast tego dążą do „wygląda dobrze na większości systemów” - nadal wygląda to trochę obco, ale jest użyteczne i znacznie łatwiejsze do opracowania.
źródło
Nie jest trudno stworzyć przycisk, który wygląda jak przycisk OSX, Windows lub jakikolwiek inny zestaw narzędzi. Jednak wytyczne interfejsu użytkownika dla większości środowisk nie są tak proste, jak podstawy „tak wygląda przycisk”. Istnieje wiele subtelniejszych różnic, od odstępów między elementami interfejsu użytkownika do kolejności, w której pewne dobrze znane akcje powinny pojawić się na liście, do dokładnej pozycji okna dialogowego Preferencje / Opcje w systemie menu. Można zautomatyzować najczęstsze przypadki dla bardzo prostych interfejsów użytkownika, ale wiele, jeśli nie większość zadań interfejsu użytkownika wymaga znacznie lepszego dotyku.
SWT próbowało do pewnego stopnia zautomatyzować to i po raz kolejny robi to dobrze dla prostych zadań interfejsu użytkownika. Ale nie ma jednego uniwersalnego rozwiązania, więc kiedy interfejsy użytkownika stają się bardziej złożone, podstawowe metody, których używa, zaczynają się rozpadać. Zasadniczo możliwe jest dostosowanie go do żmudnej ręcznej pracy interfejsu użytkownika, ale nie jest to coś, co większość programistów jest w stanie lub jest skłonna zrobić dla wszystkich platform.
Podejście Swinga polegało na unikaniu natywnych zestawów narzędzi, gdy tylko było to możliwe. Nie jest natywny i nie próbuje: zamiast tego próbuje stworzyć coś, co będzie wyglądało (prawie) tak samo, bez względu na to, gdzie zostanie uruchomione. Zamiast próbować (bezskutecznie) zadowolić wszystkich, starał się zadowolić siebie i chociaż udało mu się to w tym zakresie, można kwestionować skuteczność tego działania dla szerszej społeczności użytkowników.
źródło
Istnieje kompromis między oczekiwaniem, że aplikacja będzie wyglądać tak naturalnie, jak to możliwe na każdym systemie, a oczekiwaniem, że aplikacja będzie działać w ten sam sposób na każdym systemie. Nie ma „właściwego” wyboru.
Co więcej, nawet jeśli wybierzesz „naturalnie wyglądającą” stronę, możesz chcieć chronić użytkowników twojego graficznego zestawu narzędzi przed „ulepszeniami” w podstawowych komponentach natywnych i API, które mogą nieoczekiwanie zepsuć ich aplikację.
To dlatego niektórzy programiści GUI wolą dostarczać własne komponenty, które naśladują natywne, ale zapewniają własną implementację. Z drugiej strony opracowanie funkcjonalnie kompletnego zestawu narzędzi GUI to znaczny wysiłek, a względy ekonomiczne mogą prowadzić do ograniczenia kilku aspektów.
Pamiętaj, że ten problem nie jest związany z Javą, ale napotyka go każda firma produkująca niezależne od platformy zestawy narzędzi.
źródło
Wszystko dzięki historii.
Firma Sun chciała, aby całe oprogramowanie Java działało tak samo na wszystkich komputerach.
Aby oprogramowanie „wyglądało na natywne”, musi działać tak samo, jak inne oprogramowanie w danym systemie operacyjnym.
Firma Sun zrobiła wszystko, co w ich mocy, aby utrudnić pisanie oprogramowania Java zintegrowanego z systemem operacyjnym, ponieważ każda integracja z systemem operacyjnym sprawiłaby, że oprogramowanie działałoby inaczej w każdym systemie operacyjnym.
Obecnie niewielu programistów Java interesuje się czymkolwiek innym niż oprogramowanie oparte na serwerze WWW.
Sun zabił Javę na pulpicie, przetrząsając wszystkich programistów, którzy korzystali z systemów opartych na Javie Microsoft, przez co każdy programista, który wybrał Javę na początku, wyglądał źle.
Każdy, kto pisze oprogramowanie komputerowe, które dba o „wygląd natywny”, nauczył się dawno temu, że nie korzysta z Javy, a jego poglądy są wzmacniane za każdym razem, gdy używają oprogramowania Oracle.
Dlatego w dzisiejszych czasach nie ma zapotrzebowania na „pojawienie się” w oprogramowaniu komputerowym od programistów Java.
źródło
To, co uważasz za
native
rzeczywiste, to aplikacje natywne, które robią swoje, a zestawy narzędzi takie jak SWT są zgodne z opublikowanymi standardami interfejsu użytkownika tego systemu operacyjnego. Problem polega na tym, że nikt nie tworzy aplikacji zgodnych z tymi standardami, więc po uruchomieniu aplikacji Java. Wygląda na to, że nie jest natywny. Na przykład prawie wszystkich projektów Microsoft (Office, Outlook itp.) Nie można odtworzyć wizualnie przy użyciu standardowych kontrolek Windows.Będzie jeszcze gorzej, gdy zarówno Microsoft, jak i Apple dodadzą dynamiczne funkcje interfejsu użytkownika do swoich platform operacyjnych. Umożliwianie programistom zmiany wyglądu i stylizacji aplikacji w ten sam sposób, w jaki projekty internetowe tworzą style dla stron internetowych.
Java na platformie Android podąża tą ścieżką. Tworzenie elementów interfejsu użytkownika dla systemu Android zdefiniowanych w języku XML za pomocą stylów z możliwością zmiany skórki.
Java nigdy nie była tak popularna jako platforma komputerowa. W rezultacie te zmiany w branży nie rozprzestrzeniają się do środowisk uruchomieniowych komputerów stacjonarnych. Po prostu nie ma wystarczającej liczby programistów gotowych poświęcić czas na rozwiązanie problemu.
źródło
Który system operacyjny też chcesz wyglądać na „natywny”?
Po prostu nie możesz być dla nich wszystkich przez 100% czasu.
SWT itp. Są najlepszym podejściem, aby wyglądać tak natywnie dla nich wszystkich, jak to możliwe, gdy trzeba osiągnąć kompromis .
W rzeczywistości kompromis ten staje się coraz trudniejszy do osiągnięcia; nie tyle z powodu systemów operacyjnych, ale z powodu urządzeń wejściowych. W przypadku ekranów dotykowych trzeba projektować inaczej, ponieważ nie ma prawego przycisku myszy. Dlatego w przeciwnym razie musisz dostosować tę samą funkcjonalność.
Nigdy nie będzie magiczny przycisk, który przenosi funkcjonalność „intuicyjnie” z prawego przycisku myszy guestures, bez wy specifiying każdy szczegółowy aspekt dla każdego urządzenia wejściowego (w tym momencie, jesteś native do każdej platformy zostały uznane, ale mimo to nie - dotyczy każdego, którego nie wziąłeś pod uwagę).
źródło
Naprawdę dobre pytanie. Zawsze zastanawiałem się nad tym przez kilka następnych lat w przeszłości, myślałem, że jest jakiś uzasadniony powód, ale tak naprawdę nie ma.
Myślę, że odpowiedź jest raczej prosta i wiele odpowiedzi tak naprawdę nie zagłębia się w problem.
Jeśli Twój język pozwala narysować piexel na ekranie, możliwe jest w 100% stworzenie na nim frameworka GUI, który będzie naśladował wygląd i działanie formantów systemu Windows.
Ponieważ Java jest wieloplatformowa, można również całkowicie upewnić się, że w oparciu o rzeczywisty typ systemu operacyjnego (Mac / Windows) interfejs użytkownika będzie wyglądał inaczej na obu platformach, pasując do stylu platformy wykonawczej.
Jak widać w XAML, na przykład interfejs użytkownika można łatwo przedstawić w bardzo uporządkowanej formie i języku. Wybór zachowań „rodzimych” jest również możliwy, jeśli zajmie to trochę czasu.
Możliwe byłoby więc stworzenie frameworka GUI, który pozwoliłby programistom Java uzyskać aplikacje, które wyglądałyby natywnie na komputerach Mac i Windows.
Dochodzimy do Swinga, czyli tylko jednego frameworku GUI z potencjalnej nieskończoności frameworku GUI, które można stworzyć dla Javy. Zachowuje się tak, jak został zaprogramowany, co nie jest zgodne z powyższym procesem, a aplikacje w obu systemach są dziwnie wyglądające. Taki wybór dokonali twórcy Swinga, nikt nie zmusił ich do zrobienia tego i zachowania w ten sposób.
źródło