سؤال

عند النقر فوق زر ، أريد أن يتم قلب الصفوف المحددة (يجب تحديد الصفوف غير المحددة ويجب أن تكون الصفوف المحددة غير محددة).

هل هناك طريقة بناء في JTable للقيام بذلك؟

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

المحلول

لا يبدو أن Jtable لديه طريقة مدمجة للقيام بذلك. لذلك قمت بتطبيقه مع الكود التالي. (آمل أن يكون هذا مفيدًا لشخص يواجه مشكلة مماثلة.)

int[] selectedIndexs = jtable.getSelectedRows();
jtable.selectAll();

for (int i = 0; i < jtable.getRowCount(); i++) {
    for (int selectedIndex : selectedIndexs) {
        if (selectedIndex == i) {
            jtable.removeRowSelectionInterval(i, i);
            break;
        }
    }
}

نصائح أخرى

لتبسيط حل سودار:

int[] selectedIndices = table.getSelectedRows();
table.selectAll();
for (int prevSel : selectedIndices) {
    table.removeRowSelectionInterval(prevSel, prevSel);
}

JTable ليس لديه هذه الميزة

لا ، سيتعين عليك تنفيذ cutsom ListSelectionListener

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

أسرع طريقة للجداول التي تحتوي على أكثر من بضع مئات من الصفوف

/**
 * Invert selection in a JTable.
 *
 * @param table
 */
public static void invertSelection(JTable table) {
    ListSelectionModel mdl = table.getSelectionModel();
    int[] selected = table.getSelectedRows();
    mdl.setValueIsAdjusting(true);
    mdl.setSelectionInterval(0, table.getRowCount() - 1);
    for (int i : selected) {
        mdl.removeSelectionInterval(i, i);
    }
    mdl.setValueIsAdjusting(false);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top