ص - OS الملحد طريقة للحصول على خط أحادي المسافة

StackOverflow https://stackoverflow.com/questions/221568

  •  03-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة في ص للحصول على خط أحادي المسافة ببساطة ، أن يعمل على مختلف أنظمة التشغيل?

على سبيل المثال.وهذا يعمل على لينكس ولكن Windows:


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

أو هل أنا بحاجة إلى أن يكون الأسلوب الذي يحاول تحميل متفاوتة الخطوط (Consolas الطرفي ، موناكو ، مونو) حتى لا باطل?بدلا من ذلك يمكنني تحديد ذلك في خصائص الملف عند بدء التشغيل.

حاولت الحصول على الخط النظام من العرض, لكن ذلك لم يكن أحادي المسافة.

هل كانت مفيدة؟

المحلول

وفقا قسم الخط ملفات التكوين في جدك وثائق دعم التدويل-ذات واجهات برمجة التطبيقات ، مفهوم الخط المنطقيةs يستخدم لتحديد معينة منصة مستقلة الخطوط التي تم تعيينها إلى المادية الخطوط في الخط الافتراضي ملفات التكوين:

منصة جافا يعرف منطقية خمسة أسماء الخط أن كل التنفيذ يجب أن الدعم:الرقيق ، SansSerif, أحادي المسافة ، الحوار ، DialogInput.هذه الخط المنطقية تعيين أسماء المادية الخطوط في التنفيذ تعتمد الطرق.

لذا في حال كنت في محاولة

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

للحصول على مؤشر إلى المادية خط أحادي المسافة من النظام الأساسي الحالي الخاص بك التعليمات البرمجية قيد التشغيل على.

تحرير:يبدو أنه سبحانه وتعالى لا أعرف أي شيء عن المنطقية الخطوط (علة 48055 على eclipse.org يصف هذا بالتفصيل).في هذه علة تقرير hackish وكان الحل المقترح ، حيث اسم البدنية الخط قد يمكن استرداد من AWT الخط...

نصائح أخرى

قضيت في حين يضرب رأسي ضد هذا واحد حتى أدركت أن من الواضح الكسوف يجب أن يكون الوصول إلى monospace للاستخدام في حقول النص ، console.... الخالقليل من الحفر ظهرت:

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

الذي يعمل إذا كان كل ما كنت ترغب في الحصول على عقد من بعض monospace.

تحرير: أو على أساس @ctron تعليق:

Font font = JFaceResources.getTextFont();

تحرير: التحذير (على أساس @Lii تعليق):هذا سوف تحصل على تكوين خط النص ، والتي يمكن أن تنقضها من قبل المستخدم قد لا يكون monospace.ومع ذلك, أنها سوف تكون متسقة مع مثل الخط المستخدم في المحرر وحدة وهي ربما ما تريد.

لوعلمي، وAPI AWT ليس الكشف عن معلومات الخط الأساسي. إذا كان يمكنك الحصول على ذلك، وأتوقع أن يكون التنفيذ التابع. بالتأكيد، ويقارن بين الملفات تعيين الخط في بضع JRE الدلائل ليب، أستطيع أن أرى أن لا يتم تعريفها بطريقة متسقة.

هل يمكن تحميل الخطوط الخاصة بك، ولكن يبدو أن الإسراف قليلا نظرا لانك تعرف منصة يأتي مع ما تحتاجه.

وهذا هو الإختراق الذي يقوم بتحميل خط 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;
}

ويعمل على IBM / فيروس 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();
        }
    }

}

وهذا على الأرجح ليس أسلوبا جيدا لأنه قد أترك لكم تتعرض للغة المسائل. الى جانب ذلك، كنت لا تعرف إذا كان أول خط أحادي المسافة اجهتم ليس بعض اللفات مجموعة الرمز.

والنهج الأفضل قد يكون مجرد لاتخاذ أفضل تخمين على أساس الخط / لغة الخرائط القائمة البيضاء وتأكد من أن يمكن للمستخدمين بسهولة تكوين واجهة المستخدم لتناسب أنفسهم عبر <لأ href = "HTTP: //help.eclipse. غزاله / ثابت / nftopic / org.eclipse.platform.doc.isv / إشارة / المعهد / المنظمة / كسوف / سبحانه وتعالى / الحاجيات / FontDialog.html "يختلط =" نوفولو noreferrer "> FontDialog .

وبالنسبة للأشخاص الذين لديهم نفس المشكلة، يمكنك تحميل أي ملف الصناديق الخط، ووضعها في مجلد الموارد (في حالتي /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;   }

إذا كنت ترغب فقط في استخدام الخط أحادي المسافة "الساعي" => new Font(display, "Courier", 10, SWT.NORMAL)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top