سؤال

كيف يمكنك عرض كمية كبيرة من الصفوف في جدول SWT؟ضخم هو شيء يزيد عن 20 ألف صف و 20 عمودًا.لا تسألني لماذا أحتاج إلى إظهار هذا القدر من البيانات، فهذا ليس الهدف.النقطة المهمة هي كيفية جعلها تعمل بأسرع ما يمكن حتى لا يشعر المستخدم النهائي بالملل من الانتظار.يعرض كل صف مثيلًا لبعض الكائنات، والأعمدة هي خصائصه (بعضها).فكرت في استخدام نمط موفر المحتوى/التسمية JFace، لكنني أخشى أن يكون أبطأ من ضرب الجدول مباشرةً بالبيانات.هذا هو كيف ستسير الامور:

    Display.getDefault().asyncExec(new Runnable() {
       public void run() {
           List<MyObject> objects = model.getViewData();
           for(MyObject object: objects){
           TableItem item = new TableItem(table, SWT.NULL);
           item.setImage(0, img1);
           item.setBackground(color1);
               item.setText(0, object.getProperty0());
               item.setText(1, object.getProperty1());
               item.setText(2, object.getProperty2());
               ..... 
            }
       });

يستغرق رسم 20 ألف سجل على جهاز الكمبيوتر الخاص بي حوالي 20 ثانية.أكبر مشكلة في الأداء رأيتها في Windows ناتجة عن كمية لا تصدق من رسائل النوافذ الأصلية التي يرسلها SWT عند إنشاء عنصر جدول جديد وملؤه بالنص.لقد وجدت حلاً رائعًا لهذا - إخفاء الجدول قبل تعبئته، ثم إظهاره عند الانتهاء.مجرد استدعاء table.setVisible(false) قبل الحلقة وtable.setVisible(true) بعد الحلقة يحدث العجائب - ترتفع السرعة ستة إلى سبعة مرات!

أود تسريع الأمر أكثر.ما اقتراحك ؟وأتساءل أيضًا كيف ستعمل هذه الخدعة التي تخفي الأداة على تطبيقات SWT (المعروفة أيضًا باسم Linux) التي لا تعمل بنظام Windows؟

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

المحلول

SWT يمكن أن تفعل ذلك من أجلك. عند استخدام علامة نمط SWT.Virtual، يتم إنشاء العناصر فقط عند التمرير في العرض. هيريس كيفية القيام بذلك:

  1. إنشاء الجدول مع نمط swt.virtual
  2. تعيين عدد الصفات باستخدام الجدول # setitemcount ()
  3. إضافة مستمع SWT.SETDATA الذي يملأ المائدة على الطلب.

إليك مقتطف رمز:

public static void main( String[] args ) {
    Display display = new Display();
    Shell shell = new Shell( display );
    shell.setLayout( new FillLayout() );
    final Table table = new Table( shell, SWT.VIRTUAL );
    table.setItemCount( 10000 );
    table.addListener( SWT.SetData, new Listener() {
        public void handleEvent( Event event ) {
            TableItem item = (TableItem)event.item;
            item.setText( "Item " + table.indexOf( item ) );
        }
    } );
    shell.setSize( 300, 500 );
    shell.open();
    while( !shell.isDisposed() ) {
        if( !display.readAndDispatch() ) {
            display.sleep();
        }
    }
    display.dispose();
}

نصائح أخرى

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

يرى هذه المقالة (تحرير: عفوا، قصدت هذه المقالة) للحصول على مثال JFACE.

1 - استخدم setText(String[]) بدلاً من setText(int, String) مكالمة واحدة بدلاً من عدة.

2 - استخدم myTable.setRedraw(false) قبل وmyTable.setRedraw(true) بعد العملية لإيقاف جميع عمليات إعادة الرسم أثناء تحميل البيانات.

إنه أبسط ويمكن أن يحسن الأداء !!

حظ سعيد.

من جانبي باستخدام هذا أقوم بتحميل 2500 سطرًا من 20 عمودًا في أقل من 300 مللي ثانية .....على جهاز كمبيوتر قياسي اليوم.

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