2013-05-03 5 views
1

Я исправляю отображение шрифтов в одном из наших приложений Java Swing. Что изменилось после использования опции «-Dfile.encoding = UTF-8» во время выполнения.Monospace и UTF8

FontClass.jar - это пример файла jar-файла.

option 1: 
javaw -Xmx256M -jar -Dfile.encoding=UTF-8 "FontClass.jar" 

option 2: 
javaw -Xmx256M -jar "FontClass.jar" 

С опцией 1: я получаю моноширинный дисплей

С опцией 2: я получаю нон моноширинный дисплей.

Ограничение:

я) -Dfile.encoding = UTF-8 Этот вариант мы добавили, чтобы все наши потоки поддерживают поддержку UTF-8. Вместо изменения каждого потока вручную.

ii) Мы используем java swing frame work и во многих местах. Мы являемся шрифтом uisng default. Изменение всего этого - много работы.

Так что теперь у меня вопрос есть любой параметр командной строки с помощью которой я могу получить дисплей MONOSPACE с опцией 1:

Ниже приведен пример кода:

class Show extends Frame { 
    FontMetrics fontM; 
    String outString; 

    Show(String target, String title, Font font) { 

     setTitle(title); 
     outString = target; 

     fontM = getFontMetrics(font); 
     setFont(font); 

     int size = 0; 
     for (int i = 0; i < outString.length(); i++) { 
      size += fontM.charWidth(outString.charAt(i)); 
     } 
     size += 24; 

     setSize(size, fontM.getHeight() + 60); 
     setLocation(getSize().width/2, getSize().height/2); 
     setVisible(true); 
    } 

    public void paint(Graphics g) { 
     Insets insets = getInsets(); 
     int x = insets.left; 
     int y = insets.top; 
     g.drawString(outString, x + 6, y + fontM.getAscent() + 14); 
    } 
} 

public class Fontclass { 

    public static void main(String[] args) { 



     String jaString = new String("\u65e5\u672c\u8a9e\u6587\u5b57\u5217"); 

     String inputString = "\niiii\naaaaiiii"; 

     String displayString = jaString + " " + inputString; 

     Font font; 
     font = new Font("Courier",3, 24); 

     new Show(displayString, "Demo",font); 

    } 
} 
+1

* "Ниже приведен пример кода:" * В чем вопрос? Почему код использует компоненты AWT, а не Swing? Пожалуйста, исправьте форматирование кода, с почти 700 rep. вы должны были это понять уже сейчас. –

+0

В обоих случаях это выглядит точно так же ... –

+0

Для меня и многих других в моей команде оба выглядят иначе. С опцией 1 Шрифт «Курьер» - «Курьер». Но с вариантом 2 Courier «выглядит как« Courier new » – vrbilgi

ответ

1

От FontMetrics API , который определяет аванс в терминах charWidth(): «Обратите внимание, что наступление String не обязательно является суммой авансов его персонажей». Кроме того, шрифт "Courier" может быть моноширинным, но может быть не - тот же шрифт, указанный в Font.MONOSPACED.

Вместо этого используйте TextLayout для получения необходимой геометрии, как показано на рисунке here, here и here.