سؤال

لدي بضعة آلاف من الأسطر من التعليمات البرمجية في مكان ما و لقد لاحظت أن بلدي JTextPane ومضات عندما أقوم بتحديث هذا الموضوع كثيرا..كتبت نسخة مبسطة من هنا:

import java.awt.*;
import javax.swing.*;

public class Test
{
    static JFrame f;
    static JTextPane a;
    static final String NL = "\n";

    public static void main(String... args)
    {
        EventQueue.invokeLater(new Runnable(){
        public void run()
        {
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        f.setSize(400, 300);
        f.setLocationRelativeTo(null);

        a = new JTextPane();
        f.add(new JScrollPane(a));

        new Thread(new Runnable(){
            public void run()
            {
                int i = 0;
                StringBuffer b = new StringBuffer();
                while(true)
                {
                    b.append(++i+NL);
                    a.setText(b.toString());
                    a.setCaretPosition(b.length());
                    try{Thread.sleep(10);}catch(Exception e){}
                }
            }
        }).start();
        }
        });

    }
}

هذا هو محطة (cmd) نمط واجهة المستخدم الرسومية المكون--

أعتقد أنني قدمت كل التحسينات يمكنني هنا ، بما في ذلك وجود \n النهائي متغير لذلك لن يكون شيدت مئات المرات.لا الخفقان هو ملحوظ وغير مقبول.بعد بضع دقائق, المكون يتجمد تماما.يجب تحديث المكون بسرعة جدا و جزء يجب تمريره إلى أسفل عند تحديث.

لقد تم التفكير في صنع نسختي الخاصة من JTextPane من الصفر ، ولكن أود أن أرى إذا كان لديكم حل أسهل.

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

المحلول

جزء من الخطأ أن يتم الوصول إلى البديل المكون من خارج الحدث الخيط!نعم ، setText() هو مؤشر الترابط-الآمن ، ولكن البديل الأساليب ليست مؤشر الترابط-الآمن إلا إذا أعلن صراحة على هذا النحو.وهكذا ، setCaretPosition() هو ليس موضوع آمن ويجب أن يكون الوصول إليها من موضوع الحدث.وهذا يكاد يكون من المؤكد السبب في التطبيق الخاص بك في نهاية المطاف يتجمد.

ملاحظة: JTextPane يرث لها setText() طريقة من JEditorPane و setCaretPosition طريقة من JTextComponent, مما يفسر الروابط في الفقرة السابقة لن JTextPane جافادوك الصفحة.

إلى أن مؤشر الترابط-الآمن ، كنت حقا بحاجة إلى ما لا يقل عن الدعوة setCaretPosition() من داخل الحدث موضوع التي يمكنك القيام به مع رمز مثل هذا:

SwingUtilities.invokeAndWait(new Runnable() {
  public void run() {
    a.setText(b.toString());
    a.setCaretPosition(b.length());
  }
}

ومنذ عليك الاتصال setCaretPosition() من داخل الحدث موضوع ربما عليك أيضا الاتصال setText() من نفس المكان.

فمن الممكن أن كنت قد لا تحتاج إلى تعيين يدويا موقف الإقحام.راجع قسم "الإقحام التغييرات" في جافادوك على JTextComponent.

أخيرا, قد ترغب في التحقق سلسلة من مادتين:

نصائح أخرى

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

أنا أعتقد أن النص جزء قد يكون الحصول على رسم مرتين ، مرة عند استدعاء setText() و مرة واحدة عند استدعاء setCaretPosition(), و التي يمكن أن تسهم في الخفقان.غير متأكد ، على الرغم من (انها كانت فترة من الوقت منذ أن كنت أعمل مع البديل).

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