2011-08-25 11 views
8

Używam Netbeans 7.0 z JDK6 pod Windows 7 do zaprojektowania interfejsu użytkownika mojej aplikacji Java. Stosuję wygląd i styl systemu. Ale wygląda tak, jak chcę w Windows, ale różni się w MacOS, a co gorsza, wygląda inaczej w różnych menedżerach okien w Linuksie (LXDE, GNOME, KDE, XFCE).Jaka czcionka w Swing wygląda tak samo we wszystkich systemach operacyjnych?

Przez różne mam na myśli wygląd czcionek i ich rozmiar. W systemie Windows, jeśli etykieta wygląda "v 1.23", wygląda na "v ..." w innych systemach operacyjnych, ponieważ czcionki stają się większe w tym systemie operacyjnym, a JLabel nie ma wystarczająco dużo miejsca do wyświetlenia. Zdarza się to w kilku miejscach.

Nie chcę zwiększać szerokości etykiety. Chcę, aby etykieta wyglądała tak samo w danej szerokości we wszystkich systemach operacyjnych. Domyślnie Netbeans używa czcionki Tahoma 11pt na moim komputerze. Myślę, że nie jest dostępny we wszystkich systemach operacyjnych, więc inne systemy używają innej czcionki.

Czy Arial jest często używaną czcionką?

Czy muszę ręcznie zmienić czcionkę każdego elementu na Arial? Lub jakiekolwiek inne opcje?

+2

Krótka odpowiedź brzmi, że nie możesz i nie musisz. Zaprojektuj swój interfejs użytkownika tak, aby nie pękł, gdy czcionka (ze wszystkich rzeczy - następnie będziesz wymagać, aby okno pozostało w lewym górnym rogu?) Lub tekst nieznacznie się zmienia. Pomyśl o i18n lub po prostu o dobrym pomysłem projektanta. – delnan

+0

Zobacz [Fizyczne i logiczne czcionki] (http://download.oracle.com/javase/6/docs/api/java/awt/Font.html) i [Korzystanie z menedżerów układu] (http://download.oracle. com/javase/tutorial/uiswing/layout/using.html). – trashgod

Odpowiedz

5

Jeśli chodzi o menedżerów okien, jest o wiele więcej niż rozmiar czcionki, np. Szerokość między dwoma kontrolkami jest inaczej obsługiwana w gnome & KDE. jeśli chodzi o używanie tego samego rozmiaru czcionki na wszystkich platformach, można użyć czcionki Sans Serif, jest to dostępne we wszystkich systemach operacyjnych, z którymi współpracowałem.

byłoby również lepiej (jeśli nie możesz znaleźć serif w systemie operacyjnym, na którym chcesz uruchomić swoją aplikację), możesz pobrać czcionkę (darmowe z GNU Free Fonts).

jeśli chodzi o ustawienie wielkości czcionki & czcionek, to dlaczego nie spróbować użyć motywu & ustawić czcionkę tam ... można użyć metody UIManager.setLookAndFeel() zmianie tematów. tutaj jest łącze na Look & Feel

+1

Serif nie jest czcionką. To jest kategoria czcionek. Kiedy mówisz Javie, aby używała Serif, wybiera konkretną czcionkę szeryfową na twoim komputerze. Na pewno będzie wiele od systemu operacyjnego do OS. –

+0

Opuściłem to, teraz zaktualizowałem swoją odpowiedź dzięki @Steve –

+0

@Anantha Sharma Dzięki za odpowiedź. Planuję użyć motywu Nimbus. – Vigneshwaran

0

Lucida Sans Regular jest zawsze w pakiecie z Javą, ale nie sądzę, że rozwiąże problem polegający na tym, że część tekstów/etykiet wychodzi z formatu. To zależy również od resulotionu ekranu użytkownika.

8

Zamiast tego należy użyć layout manager i logical font family. Ten numer example z poniższym numerem Font dodaje tekst 24-punktowy kursywy do środka (domyślnie) BorderLayout, aby uzyskać przyjemny wynik na odmiennych platformach.

ta.setFont(new Font("Serif", Font.ITALIC, 24)); 

Mac OS X:

Mac

Windows 7:

Windows

Ubuntu Linux:

Linux

+1

Niestety, właśnie zauważyłem, że pojęcie "Serif" w Ubuntu wygląda niepokojąco "SansSerif". :-) – trashgod

+1

Jeśli obawiasz się zmiany łańcucha "Serif", 'Font.SERIF' jest również opcją. – Starwarswii

0

Stare pytanie, ale znalazłem to, ponieważ szukałem rozwiązania. Moje rozwiązanie to: używaj czcionek DejaVu. Czcionka okna dialogowego Java wygląda inaczej w systemach Linux i Windows, ale DejaVuSans 12 jest bardzo podobny do czcionki dialogowej w systemie Linux i wygląda tak samo w systemie Windows (przynajmniej w systemie Windows 8.1). Mój kod:

... 
static Font dejaVuSans; 
static final String resPath = "<classpath>/resources/"; // no leading "/" 
... 
public static void main(String[] args) { 
    /* See: 
    * https://stackoverflow.com/questions/7434845/setting-the-default-font-of-swing-program 
    * https://stackoverflow.com/questions/8361947/how-to-get-getclass-getresource-from-a-static-context 
    */ 
    dejaVuSans = null; 
    Font f; 
    try { 
     InputStream istream = <ClassName>.class.getClassLoader().getResourceAsStream(
      resPath + "DejaVuSans.ttf"); 
     dejaVuSans = Font.createFont(Font.TRUETYPE_FONT, istream); 
     f = dejaVuSans.deriveFont(Font.PLAIN, 12); 
    } catch (Exception e) { 
     System.err.println(e.getMessage()); 
     f = null; 
    } 
    if (f == null) 
     f = new Font("Dialog", Font.PLAIN, 12); 
    java.util.Enumeration keys = UIManager.getDefaults().keys(); 
    while (keys.hasMoreElements()) { 
     Object key = keys.nextElement(); 
     Object value = UIManager.get (key); 
     if (value != null && value instanceof javax.swing.plaf.FontUIResource) 
      UIManager.put (key, f); 
    } 
    ... 
} 

Oczywiście, jeśli DejaVuSans.ttf nie jest osadzona w pliku jar można importować go w czasie wykonywania. Zobacz How do you import a font?.

Powiązane problemy