2008-10-21 10 views
27

क्या एसडब्ल्यूटी में एक मोनोस्पेस्ड फ़ॉन्ट प्राप्त करने का कोई तरीका है, जो विभिन्न ऑपरेटिंग सिस्टम में काम करता है?एसडब्ल्यूटी - मोनोस्पेस्ड फ़ॉन्ट प्राप्त करने के लिए ओएस अज्ञेय तरीका

उदाहरण के लिए। इस लिनक्स पर काम करता है, लेकिन नहीं विंडोज:

 

Font mono = new Font(parent.getDisplay(), "Mono", 10, SWT.NONE); 
 

या मैं एक विधि है कि जब तक एक अशक्त नहीं है लोड हो रहा है अलग फोंट (Consolas, टर्मिनल, मोनाको, मोनो) की कोशिश करता है की जरूरत है? वैकल्पिक रूप से मैं इसे स्टार्टअप पर एक प्रॉपर्टी फ़ाइल में निर्दिष्ट कर सकता हूं।

मैंने डिस्प्ले से सिस्टम फ़ॉन्ट प्राप्त करने का प्रयास किया, लेकिन यह मोनोस्पेस्ड नहीं था।

उत्तर

15

Internationalization Support संबंधित एपीआई, तार्किक फ़ॉन्ट रों निश्चित मंच स्वतंत्र फोंट जो डिफ़ॉल्ट फ़ॉन्ट विन्यास फाइल में शारीरिक फोंट पर मैप किए जाते परिभाषित करने के लिए प्रयोग किया जाता है की अवधारणा के JDK दस्तावेज में Font Configuration Files पर खंड के अनुसार:

जावा प्लेटफ़ॉर्म पांच लॉजिकल फ़ॉन्ट नामों को परिभाषित करता है जो प्रत्येक कार्यान्वयन को समर्थन देना चाहिए: सेरिफ़, सांससेफ, मोनोस्पेस्ड, संवाद, और संवाद इनपुट। ये तार्किक फ़ॉन्ट नाम कार्यान्वित निर्भर तरीकों में भौतिक फ़ॉन्ट्स के लिए मैप किए गए हैं।

तो आपके मामले में, मैं

Font mono = new Font(parent.getDisplay(), "Monospaced", 10, SWT.NONE);

अपने कोड पर चल रहा है वर्तमान मंच के भौतिक monospaced फ़ॉन्ट के लिए एक संभाल प्राप्त करने की कोशिश होगी।

संपादित: ऐसा लगता है कि SWT तार्किक फोंट के बारे में कुछ भी पता नहीं है (Bug 48055 eclipse.org पर विस्तार से वर्णन करता है)। इस बग रिपोर्ट में एक हैकिश वर्कअराउंड का सुझाव दिया गया था, जहां भौतिक फ़ॉन्ट का नाम एडब्ल्यूटी फ़ॉन्ट से पुनर्प्राप्त किया जा सकता है ...

+3

यह भी java.awt.Font.MONOSPACED – nos

+0

के रूप में ऐसा लगता है कि वे एक [SWTFontUtils] (https://bugs.eclipse.org/bugs/attachment.cgi?id=238603) वर्ग प्रदान की उपलब्ध होना चाहिए अभी इसके लिए – Campa

4

मेरे सर्वोत्तम ज्ञान के लिए, एडब्ल्यूटी एपीआई अंतर्निहित फ़ॉन्ट जानकारी का खुलासा नहीं करता है। यदि आप इसे प्राप्त कर सकते हैं, तो मैं उम्मीद करता हूं कि यह कार्यान्वयन पर निर्भर हो। निश्चित रूप से, दो जेआरई lib निर्देशिकाओं में फ़ॉन्ट मैपिंग फ़ाइलों की तुलना, मैं देख सकता हूं कि उन्हें लगातार तरीके से परिभाषित नहीं किया गया है।

आप अपने फोंट लोड कर सकते हैं, लेकिन यह आपको थोड़ा कचरा लगता है, क्योंकि आपको पता है कि प्लेटफार्म आपको क्या चाहिए।

यह एक हैक है कि एक JRE फॉन्ट लोड करता है:

private static Font loadMonospacedFont(Display display) { 
    String jreHome = System.getProperty("java.home"); 
    File file = new File(jreHome, "/lib/fonts/LucidaTypewriterRegular.ttf"); 
    if (!file.exists()) { 
     throw new IllegalStateException(file.toString()); 
    } 
    if (!display.loadFont(file.toString())) { 
     throw new IllegalStateException(file.toString()); 
    } 
    final Font font = new Font(display, "Lucida Sans Typewriter", 10, 
      SWT.NORMAL); 
    display.addListener(SWT.Dispose, new Listener() { 
     public void handleEvent(Event event) { 
      font.dispose(); 
     } 
    }); 
    return font; 
} 

यह आईबीएम/Win32/JRE1.4, सूर्य/Win32/JRE1.6, सूर्य/लिनक्स/JRE1.6 पर काम करता है, लेकिन है एक सुंदर नाजुक दृष्टिकोण। I18N के लिए आपकी ज़रूरतों के आधार पर, यह भी परेशानी हो सकती है (मैंने चेक नहीं किया है)।

एक और हैक फोंट मंच पर उपलब्ध परीक्षण करने के लिए किया जाएगा:

public class Monotest { 

    private static boolean isMonospace(GC gc) { 
     final String wide = "wgh8"; 
     final String narrow = "1l;."; 
     assert wide.length() == narrow.length(); 
     return gc.textExtent(wide).x == gc.textExtent(narrow).x; 
    } 

    private static void testFont(Display display, Font font) { 
     Image image = new Image(display, 100, 100); 
     try { 
      GC gc = new GC(image); 
      try { 
       gc.setFont(font); 
       System.out.println(isMonospace(gc) + "\t" 
         + font.getFontData()[0].getName()); 
      } finally { 
       gc.dispose(); 
      } 
     } finally { 
      image.dispose(); 
     } 
    } 

    private static void walkFonts(Display display) { 
     final boolean scalable = true; 
     for (FontData fontData : display.getFontList(null, scalable)) { 
      Font font = new Font(display, fontData); 
      try { 
       testFont(display, font); 
      } finally { 
       font.dispose(); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     Display display = new Display(); 
     try { 
      walkFonts(display); 
     } finally { 
      display.dispose(); 
     } 
    } 

} 

यह शायद एक अच्छा दृष्टिकोण यह आप मुद्दों स्थान में उजागर छोड़ सकते हैं के रूप में नहीं है। इसके अलावा, आप नहीं जानते कि पहले मोनोस्पेस्ड फ़ॉन्ट जो आप पार करते हैं वह कुछ विंडिंग्स आइकन सेट नहीं है।

सबसे अच्छा तरीका सिर्फ फ़ॉन्ट/लोकेल मैपिंग श्वेतसूची के आधार पर अपना सर्वश्रेष्ठ अनुमान लगाने के लिए हो सकता है और यह सुनिश्चित कर लें कि उपयोगकर्ता FontDialog के माध्यम से स्वयं को उपयुक्त बनाने के लिए आसानी से यूआई को फिर से कॉन्फ़िगर कर सकें।

+0

विस्तृत उत्तर के लिए धन्यवाद। मेरा मानना ​​है कि सबसे अच्छा विकल्प यह है कि आप कहते हैं - विशिष्ट सभी ब्लॉन्ड डिफ़ॉल्ट जैसे कि कूरियर जो सभी प्लेटफ़ॉर्म पर उपलब्ध है, और उपयोगकर्ता को इस कॉन्फ़िगरेशन को फ़ॉन्ट कॉन्फ़िगरेशन संवाद के साथ बदलने की अनुमति देता है। – JeeBee

+0

क्या एसडब्ल्यूटी में फ़ाइल पथ की बजाय जावा संसाधन या 'इनपुटस्ट्रीम' से 'फ़ॉन्ट' लोड करने का कोई तरीका है? – parxier

+0

@parxier - यह नहीं कि मुझे पता है। यह एक नए सवाल के रूप में बेहतर होगा। – McDowell

1

यदि आप चाहते हैं सिर्फ एक Monospaced फ़ॉन्ट उपयोग "कूरियर" =>new Font(display, "Courier", 10, SWT.NORMAL)

35

मैं थोड़ी देर के खर्च इस एक के खिलाफ मेरे सिर को कोसने जब तक मुझे एहसास हुआ कि स्पष्ट रूप से ग्रहण अपने पाठ में इस्तेमाल के लिए एक monospace फ़ॉन्ट के लिए उपयोग किया जाना चाहिए खेतों, कंसोल आदि एक छोटी सी खुदाई कर दिया:

Font terminalFont = JFaceResources.getFont(JFaceResources.TEXT_FONT); 

कौन सा काम करता है अगर आप सभी में कुछ monospace फॉन्ट की पकड़ हो रही है रुचि रखते हैं।

संपादित करें: या @ ctron की टिप्पणी के आधार पर:

Font font = JFaceResources.getTextFont(); 
+1

बहुत अच्छा! यह – pmf

+6

या यहां तक ​​कि थोड़ा सा आसान है: फ़ॉन्ट फ़ॉन्ट = JFaceResources.getTextFont(); – ctron

+1

** यह आवश्यक रूप से एक मोनोस्पेस फ़ॉन्ट नहीं होगा। ** उदाहरण के लिए, ग्रहण अनुप्रयोग में यह वही फ़ॉन्ट होगा जो उपयोगकर्ता ने * प्राथमिकता> सामान्य> रंग और फ़ॉन्ट> मूल> टेक्स्ट फ़ॉन्ट * में कॉन्फ़िगर किया है। यह वही फ़ॉन्ट है जिसका उपयोग एक्लिप्स में मूल पाठ संपादक द्वारा किया जाता है। लगभग सभी उपयोगकर्ताओं के पास एक मोनोस्पेस फ़ॉन्ट होगा, लेकिन आप सुनिश्चित नहीं हो सकते हैं। – Lii

3

जो लोग एक ही समस्या है के लिए, आप किसी भी फ़ॉन्ट ttf फ़ाइल डाउनलोड कर सकते हैं (संसाधन फ़ोल्डर में रख मेरे मामले/font में/* * .ttf) और इस मेथोड को अपने एप्लिकेशन में जोड़ें। यह 100% काम है।

public Font loadDigitalFont(int policeSize) { 
    URL fontFile = YouClassName.class 
      .getResource("/fonts/DS-DIGI.TTF"); 
    boolean isLoaded = Display.getCurrent().loadFont(fontFile.getPath()); 
    if (isLoaded) { 
     FontData[] fd = Display.getCurrent().getFontList(null, true); 
     FontData fontdata = null; 
     for (int i = 0; i < fd.length; i++) { 
      if (fd[i].getName().equals("DS-Digital")) { 
       fontdata = fd[i]; 
       break; 
      }} 
     if (fontdata != null) { 
      fontdata.setHeight(policeSize); 
      fontdata.setStyle(SWT.BOLD);return new Font(getDisplay(), fontdata));} 
    }return null; } 
+0

यह मेरे लिए उबंटू 12.04 + ग्रहण 3.7 पर काम करता था, लेकिन विंडोज 7 + ग्रहण 4.3 लोडफॉन्ट() पर झूठी वापसी होती है जब इसकी तर्क फ़ाइल के बजाए बंडल यूआरएल होती है। –

+0

आपको यह देना चाहिए कि दिए गए सापेक्ष पथ "/fonts/DS-DIGI.TTF" संसाधन निर्देशिका में हैं, क्या आप मेवेन का उपयोग कर रहे हैं? – freesniper

संबंधित मुद्दे