سؤال

لقد كنت أحاول تعزيز نظام GUI الخاص بي المكتوب في جافا لاستخدام الفادحة الفرعية وتم تنجح، باستثناء اثنين من الحالات الشاذة المتبقية. هذا هو اتبع إلى بلدي سؤال آخر منذ بضعة أسابيع.

المشكلة الأولى هي أن إعداد تحديد تلميحات Key_Antialiasing إلى Value_Antialias_on يؤدي إلى تجاهل key_text_antialiasing عند ضبطها على قيمة AA LCD (Subpixel). هل يستطيع اي شخص ان يسلط الضوء على هذا؟ في الوقت الحالي، أجبرت على Value_AntiAlias_off قبل تقديم نص وإيقاف تشغيله بعد تقديم النص (بحيث اللوحة الأخرى، مثل الدوائر، إلخ، هي AA'D). هذه المشكلة ثبت من خلال برنامج الاختبار المحتوي على الذات أدناه.

المشكلة الثانية هي أنه لا يمكنني العثور على أي طريقة للاستعلام عن إعداد O / S الأساسي ل AA، لذلك يجب علي القيام بعملية Kludgey بدلا من ذلك، وهو إنشاء Jlabel سوينغ، واحصل على Fontmetrics، واحصل عليه FontrenderContext ثم احصل عليه أأ تلميح من ذلك. بصرف النظر عن إشراك التأرجح في البرنامج الذي لا يستخدم خلاف ذلك على الإطلاق من التأرجح، فلن يعمل على جهاز يعمل على تشغيل أي J2ME JVM. هل يمكن لأي شخص أن يقترح طريقة أفضل للقيام بذلك؟ كل شيء على مايرام إذا كان يتطلب J5 أو J6، لأن Kludge الحالي يتطلب بالفعل J6 (ولكن تحتاج إلى J4 فقط سيكون أفضل). لقد حاولت بالفعل كل إعداد افتراضي واستخدام مكون AWT بدلا من Jlabel.


برنامج اختبار

يتحقق هذا البرنامج من أن AA Subpixel للعمل، يجب أن يتم تعطيل إعداد AA العام أولا. (ملاحظة: أنا أكتب إلى المخزن المؤقت للخلف لأن واجهة المستخدم الرسومية الأساسية التي أفعلها، وأردت الاختبار في سياق مكافئ).

import java.awt.*;
import java.awt.event.*;

public class AwtTestFrame1b extends Panel {

private final Font                      font=new Font(Font.SANS_SERIF, Font.PLAIN, 16);
private final int                       line=25;

AwtTestFrame1b() {
    setBackground(SystemColor.control);
    }

public void paint(Graphics g) {
    Graphics2D g2d = (Graphics2D)g;

    int                                 py=0;

    py=paintText(g2d,py,null                                        ,false);
    py=paintText(g2d,py,null                                        ,true );
    py+=line;

    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF     ,false);
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT ,false);
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_ON      ,false);
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_GASP    ,false);
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,false);
    py+=line;

    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF     ,true );
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT ,true );
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_ON      ,true );
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_GASP    ,true );
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,true );
    py+=line;
    }

private int paintText(Graphics2D g2d, int py, Object val, boolean aa) {
    Graphics2D                          dgc=g2d;
    char[]                              txt=("The quick brown fox jumped over the lazy dog ("+val+", General AA: "+aa+")").toCharArray();
    Image                               img=null;

    GraphicsConfiguration cfg=getGraphicsConfiguration();
    img=cfg.createCompatibleImage(getWidth(),line);
    dgc=(Graphics2D)img.getGraphics();
    dgc.setColor(getBackground());
    dgc.fillRect(0,0,getWidth(),line);
    dgc.setColor(g2d.getColor());

    if(aa       ) { dgc.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON ); }
    else          { dgc.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF); }
    if(val!=null) { dgc.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,val); }
    dgc.setFont(font);

    dgc.drawChars(txt,0,txt.length,10,line-5);
    g2d.drawImage(img,  0,py,  null);

    dgc.dispose();
    img.flush();

    return (py+line);
    }

public static void main(String[] args) {
    Frame                               wnd=new Frame("AWT Antialiased Text Sample");

    wnd.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
            }
        });
    wnd.add(new AwtTestFrame1b());
    wnd.setSize(new Dimension(1000, 600));
    wnd.setVisible(true);
    }

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

المحلول

هي AWT خصائص سطح المكتب من أي مساعدة؟ على وجه الخصوص، "awt.font.desktophts" - هذه تحتوي على تلميحات AA أن المكونات الأصلية التي تستخدمها، ولكن يمكن تطبيقها على أي رسومات 2D تريدها.

مجرد تسديدة في الظلام، بعد أن قرأت مؤخرا من خلال قسم AA في العملاء الأثرياء القذرة.

الاستخدام سوف تبدو مثل هذا:

String str = "A quick brown fox jumps over the lazy dog";
Toolkit tk = Toolkit.getDefaultToolkit();
Map desktopHints = (Map)(tk.getDesktopProperty("awt.font.desktophints"));
Graphics2D g2d = (Graphics2D)g;

if(desktopHints != null) {
    g2d.addRenderingHints(desktopHints);
}

g2d.drawString(str, someX, someY);

كنت قادرا على الحصول على نفس النتائج (باستخدام فئة المثال الخاص بك والرسومات الخاصة بك والرسومات، فقط مكتوبة الرباط للبساطة) كوضع LCD HRGB باستخدام هذه التلميحات ولا توجد مكالمات أخرى على جهازي.

لست متأكدا من إصدار Java هذا يتطلب ذلك، إذا كان ما تبحث عنه ...

نصائح أخرى

لا تنسى: "التنفيذات مجانية في تجاهل تلميحات تماما. "كمرجع، إليك ما أراه في 24 نقطة:

AwtTestFrame, 24 points

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