تابلفيو استبعاد الصف السفلي (المجموع) من الفرز

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

سؤال

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

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

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

المحلول

مع جافافس 8 فمن الممكن لتحديد سياسة الفرز ، والمشكلة هي أسهل لإصلاح.بافتراض أن الصف الذي يحتوي على الإجماليات هو TOTAL:

table.sortPolicyProperty().set(t -> {
    Comparator<Row> comparator = (r1, r2) -> 
         r1 == TOTAL ? 1 //TOTAL at the bottom
       : r2 == TOTAL ? -1 //TOTAL at the bottom
       : t.getComparator() == null ? 0 //no column sorted: don't change order
       : t.getComparator().compare(r1, r2); //columns are sorted: sort accordingly
    FXCollections.sort(t.getItems(), comparator);
    return true;
});

نصائح أخرى

استنادا إلى إجابة للسفيمير أنا تنفذ بنجاح "المجموع" مع مقارنة مخصصة.أنا تعيين المقارنة مع سورتيبيبروبيرتي العمود:col.setComparator(new BigDecimalColumnComparator(col.sortTypeProperty()));

مقارنة مخصصة:

public class BigDecimalColumnComparator implements Comparator<BigDecimal> {
    private final ObjectProperty<TableColumn.SortType> sortTypeProperty;

    public BigDecimalColumnComparator(ObjectProperty<TableColumn.SortType> sortTypeProperty) {
        this.sortTypeProperty = sortTypeProperty;
    }

    @Override
    public int compare(BigDecimal o1, BigDecimal o2) {
        TableColumn.SortType sortType = sortTypeProperty.get();
        if (sortType == null) {
            return 0;
        }

        if (o1 instanceof TotalBigDecimal) {
            if (sortType == TableColumn.SortType.ASCENDING) {
                return 1;
            } else {
                return -1;
            }
        } else if (o2 instanceof TotalBigDecimal) {
            if (sortType == TableColumn.SortType.ASCENDING) {
                return -1;
            } else {
                return 1;
            }
        }

        return o1.compareTo(o2);
    }
}

وإذا كنت تعيد دائما 0 في طريقة مقارنة مقارنة () الخاص بك؟وهذا يعني أن جميع العناصر "هي نفسها" ولا ينبغي أن تحدث أي تبادل الأماكن؟

كان لدي نفس المشكلة، وذلك بسبب خاصية TableView لاستدعاء مصنع الخلية لأن العديد من الصفوف كما هو مرئي في الجدول، وليس فقط ل VOT فهارس الصف حتى حجم القائمة تعيين بواسطة Tableview.setItems () IMO من الأفضل ضبط قيمة موجزة مباشرة بواسطة مصنع الخلية لكل عمود يحتاج إلى الحصول عليه.

هنا هو المثال البسيط لمثل هذه الفئة مصنع الخلية:

giveacodicetagpre.

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

ومع ذلك، فإن هذا الصف الإضافي لن يكون مرئيا أثناء التمرير لأسفل لأن تطبيق TableView Scrolling لا يعرف عن الصف الإضافي وسيتم التمرير فقط إلى الصف الأخير من قائمة العناصر الموجودة أسفل Viewport. يمكن حلها عن طريق تجاوز TableViewskin.getitemcount () طريقة، مثل في المثال التالي. تجاوز جدول الجدول نفسه ليس ضروريا، ولكن يوصى به إذا تم استخدام هذا الجدول في كثير من الأحيان.

giveacodicetagpre.

قد يبدو هذا مثل الاختراق، ولكنه يعمل مثل سحر.

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