2013-02-20 9 views
5

Witam wszystkich, z którymi ostatnio spotkałem się z problemem, że obecnie niektóre monitory mają różne ustawienia DPI, niektóre monitory są znacznie bardziej gęste, na przykład na wyświetlaczach Retina firmy Apple.Java/Swing, jak radzić sobie z różnymi ustawieniami DPI i gęstości ekranu?

W jaki sposób można skompensować różne ustawienia DPI i gęstości na różnych monitorach za pomocą Java? Czy możliwe jest skalowanie kontrolek na taki sam rozmiar na dowolnym monitorze. Wiem, że podczas programowania dla Androida wszystkie pomiary są w "DP" i można określić różne obrazy dla trzech różnych gęstości wyświetlania.

Czy istnieje sposób, w jaki mogę wybrać różne obrazy za pomocą Java/Swing dla różnych gęstości wyświetlania, więc moja aplikacja nie wygląda rozmytego na monitorach o wyższej gęstości? Czy to nie jest tak ważne lub możliwe? Wiem, że Chrome nie uwzględnia DPI, ale Internet Explorer i inne aplikacje.

Dziękuję za pomoc, jestem dawno programista Java Ja po prostu nigdy nie myślał o DPI przed i zastanawiałem się jak mogę iść o nim :)

Odpowiedz

4

Najpierw zaufać Look platformy &: Feel projektanci, aby wybrać rozsądne domyślne rozmiary tekstu i elementów sterujących. Następnie unikaj pokusy, aby udaremnić te domyślne ustawienia. Oto niektóre heurystyki:

  • Użyj layouts; rozważając ustawienie bezwzględne, należy rozważyć niestandardowy układ.

  • Szacunek dla preferred size komponentów.

  • Należy unikać non-resizable components.

  • W animation przeskaluj grafikę do rozmiaru otaczającego Window.

  • Testuj na wielu platformach, wykorzystując emulację zgodnie z wymaganiami.

3

Najpierw dziękuję za użyteczne linki, które podałeś, były bardzo pomocne.

Poniżej zamieściłem kilka szczegółowych informacji na temat sposobów radzenia sobie z problemami dotyczącymi zmian DPI, które napotkałem.

Problemy czcionki:

Jeśli czcionka nie przystoi w składniku następnie spojrzeć na składowe Problemy kalibrujący poniżej za często składnik nie jest wielkości tego, co jest w środku. W przeciwnym razie w JLabel można zastosować znaczniki HTML do automatycznego zawijania wierszy tekstu (istnieją inne rozwiązania, ale działa to dla mnie).

Jeśli tekst komponentu jest naturalnie domyślną czcionką, rozmiarem i stylem (Tahoma 11 plain), to wszystko jest automatycznie wykonywane dla Ciebie. Wiedz, że użytkownik574171 podał w odpowiedzi na How to set the DPI of Java Swing apps on Windows/Linux? zdjęcia przedstawiające różne problemy i moce menedżera układu i układu graficznego w jego linku do http://kynosarges.org/GuiDpiScaling.html. To pytanie dotyczy kwestii "Swing", ale jego łącze jest przydatne w porównywaniu układów WPF, JavaFX i Swing z podstawowymi komponentami i różnymi czcionkami. Widać, że najlepsza jest czcionka "Swing a", czyli Tahoma 11 Plain. Jednak działa tylko wtedy, gdy komponentem jest oczywiście domyślna czcionka, rozmiar i styl (Tahoma 11 Plain). Oznacza to pogrubienie, podkreślenie, zmianę rozmiaru, a inna czcionka tekstu wyłączy automatyczną zmianę rozmiaru dla różnych DPI.

Jeśli tekst jest czcionką domyślną (Tahoma), ale pogrubiony, podkreślony lub ma inny rozmiar, tekst nie jest skalowany dla różnych DPI. Aby naprawić skalowanie dla różnych DPI, zaznacz pole "Wyprowadź czcionkę z domyślnej czcionki". Opcja "Względna" przyjmie domyślną czcionkę skalowania DPI i zastosuje zmiany względne, takie jak większy lub mniejszy, pogrubiony i podkreślony. Wiedz, że jeśli komponentem jest JLabel, wówczas skalowanie DPI odbywa się automatycznie przy użyciu znaczników HTML pomimo tego, jak sformatować tekst (również linie okładek).

Jeśli komponentem nie jest oczywiście domyślna czcionka, styl i rozmiar (Tahoma 11 plain) lub chcesz inną czcionkę (np. Tahoma), to musisz skojarzyć zmiany w innym komponencie, który jest naturalnie domyślny a JLabel. Dlatego jeśli 125 DPI zwiększy czcionkę o 3, zwiększysz żądaną czcionkę o to samo.

Komponent Dobór Issues:

Wszystkie składniki mają właściwości korzystne, minimum, maksimum i wielkość, ale odkryłem, że nie gra dobrze ze zmianami dpi. Odpowiedzi na pytanie "Respect the preferred size składników" w odpowiedzi na trashgod mówią ci wszystko. Podsumowując, niech domyślny rozmiar komponentu zadba o siebie, ponieważ spróbuje dopasować rozmiar do tego, co jest w środku.

Jeśli komponent może korzystać z domyślnych rozmiarów, można wykonać obsługę DPI. Tak jak trashgod powiedział: "Po pierwsze, zaufaj platformie wyglądają & Poczuj projektantów, aby wybrać rozsądne domyślne rozmiary dla tekstu i kontroli, a następnie uniknąć pokusy, aby udaremnić te domyślne." Ponownie, komponent domyślnego rozmiaru zazwyczaj ma rozmiary do tego, co jest w środku (lub działa ponownie). Z własnego doświadczenia, kiedy ustawiam re-spory komponenty robię to przez "Horizontal Resizable" lub "Vertical Resizable", ponieważ odkryłem, że działa bardzo dobrze przy zmianach DPI, jak również zmianie rozmiaru okna.

Jeśli domyślny rozmiar komponentu nie działa, najpierw spróbuj spojrzeć poniżej na kilka konkretnych problemów, które znalazłem. Alternatywnie spróbuj skalować komponent zgodnie ze zmianami w komponencie, który zostanie poprawnie skalowany. IE, stosuj proporcję oczekiwanego składnika skalowania do 100% DPI i zmianę do nowego DPI. Przykładami komponentów, które muszą zostać przeskalowane do innych zmian komponentu, jest to, że tekst jest wypełniany kodem lub jest obrazem.

W ostateczności użyj JScrollPane, aby pozwolić użytkownikowi przewinąć, aby zobaczyć całość. Jeśli okno/dialog jest dość duże, to JScrollPane jest świetnym pomysłem, ponieważ jeśli DPI jest wyższy dla wzroku użytkownika, to okno często jest większe niż ekran.

Uwaga: Zauważyłem, że zamykanie grup komponentów w JPanel pomaga znacznie lepiej zmieniać zamki w manipulatorze DPI.

Problemy JTextField Rozmiar:

Ustaw właściwość kolumny i nic innego ale tekst, jeśli chcesz. Właściwość columns to liczba liter lub liczb, które chcesz wyświetlić. Zazwyczaj używany, gdy pozwalasz użytkownikowi wprowadzić numer. Wiedz, że właściwość columns działa świetnie na wielu platformach.

JSpinner Problemy Rozmiar:

Ustaw model być dokładne, aktualne, i domyślne wartości. Dlatego auto-rozmiar komponentu jest wykonywany dla maksymalnej wartości i działa świetnie dla zmian DPI i innych platform.

wiersz tabeli Wysokość Problem:

Wysokość stołu rząd nie zmienia się w wyższej DPI.Napotkałem ten problem i wygląda na to, że starałem się być kompatybilny ze starszymi wersjami Javy. Aby naprawić pomnożenie zmiany współczynnika rozmiaru czcionki lub zmiany wysokości JLabel ze względu na zmianę DPI.

0

Użyj JRE 9 (lub nowszego).

Wynika to z faktu, że środowisko wykonawcze Java (starsze wersje) deklarowało, że jest "świadomy DPI", ale nie obsługiwało go dla AWT i Swing. Aplikacje Java były wymiarowane i renderowane w oparciu o piksele, a nie odpowiednio skalowane, w tym wyświetlacze HiDPI. W każdym razie zostało to niedawno rozwiązane. Zobacz numer JEP 263: HiDPI Graphics on Windows and Linux i upgrade.

Więc zwiększenie rozmiaru czcionki nie działa (ponieważ nie zwiększa reszty rzeczy); argument jvm -Dsun.java2d.dpiaware=false nie działa (ponieważ nie jest obsługiwany); i plik manifestu + edycja rejestru (dla Windows) po prostu nie działa.

Następnie należy uruchomić go na środowisku JRE 9, ponieważ naprawdę obsługuje tę funkcję.

Powiązane problemy