2016-03-20 20 views
0

Bu sorunun daha önce sorulmuş olduğunu ve çalışma kodunu kesip yapıştırabildiğim çok fazla iş parçacığı olduğunu biliyorum, ancak sorum şu ki, aşağıdaki kodun neden çalışmadığıyla ilgili. Birden çok öğeyi bir JList'ten kaldırmaya çalışıyorum, ancak aşağıdaki kodu çalıştırdığımda, sınır özelliğinden çıkarım.JList öğesinden bir öğe kaldırma

static DefaultListModel<File> listModel = new DefaultListModel<>(); 
JList<File> fileList = new JList<>(listModel); 

void removeFiles() { 
    int[] listRange = new int[100]; 
    listRange = fileList.getSelectedIndices(); 
    int i = 0; 
    while (i <= listRange.length) { 
     listModel.remove(listRange[i]); 
     i++; 
    } 
} 

O fileList veri olmaktadır onaylamak için hata ayıklama ifadeleri kullandım ve ben de listRange yılında endeksleri temsil ettiğini teyit ettik (Ben 4 eklerseniz yani uzunluğu 4 olan dosyaları): İşte snippit var kaldırmak istediğim dosyaların dizinleri. Ama bir sebepten dolayı, onları ortadan kaldırmaz. fileList'dan ve aynı zamanda modelden (listModel) kaldırmayı denedim, ancak ikisi de işe yaramayacak. Burada bir şey mi görüyorum? Teşekkürler.

+0

'sürü iş parçasını kesip yapıştırabildiğim konularım, ama sorum şu aşağıda neden kodun çalışmadığıyla ilgili bir soru değil. - Peki neden çalışma kodunu kodunuzla karşılaştırmıyorsunuz, farkın ne olduğunu görmek için. Sorunun ne olduğunu söylerseniz, bu, çalışma kodunu kesip yapıştırarak aynı sonuç olacaktır. Bu, bir şey öğrenmediğiniz problemin bazı temel hata ayıklamalarını yapmayı öğrenmediğiniz sürece, sizin için sorunu çözeceğimiz anlamına gelmez. – camickr

cevap

0

indeksleri sipariş vardır:

int[] listRange = fileList.getSelectedIndices(); 
int i = listRange.length-1; 
while (i >= 0) { 
    listModel.remove(listRange[i]); 
    i--; 
} 
+0

Evet, bir şey kaldırdığımda, indeksler değiştiğinde anlamlıdır. Teşekkürler! – user3226170

+1

"getSelectedIndices" siparişi verilmediyse bu çalışmaz. –

+0

Bu doğrudur. Bu durumda fileList'i kopyalayabilir, kopyanın üzerine geçirebilir ve orijinalden kaldırabilirsiniz. –

2

Listeden bir öğeyi kaldırdığınızda, boyutu azalacaktır.

Yani 3 öğelerin listesini örneğin, size ilkini kaldırdığınızda indeksi 1 ve 2 öğeyi kaldırmak istediğiniz, liste Yani list.remove(2) diyen tek 2 0 dizininde kalan öğeleri ve 1. sahiptir olacak outOfBoundException ile sonuçlanır

Olası bir çözüm, yineleyiciyi kullanmak ve kaldırmak istediğiniz dizinlerden birine ulaşıncaya kadar arama yapmaya devam etmektir. Ya da bir sonraki dizini kaldırmak için zaten kaldırılmış olan kaldırma sayısına göre azaltın.

PS: Bu, yalnızca getSelectedIndices düzenli bir dizi döndürdüğünde çalışır. Aksi takdirde, sınırları istisna out önlemek için kutu çözeltiden ters sırada öğeleri kaldırmak olacaktır kendiniz

static DefaultListModel<File> listModel = new DefaultListModel<>(); 
JList<File> fileList = new JList<>(listModel); 

void removeFiles() { 
    int[] listRange = new int[100]; 
    listRange = fileList.getSelectedIndices(); 
    int i = 0; 
    //The counter of the removed items so far 
    int nbOfRemovedItems = 0; 

    while (i <= listRange.length) { 
     // After each remove, the index of the items is decreased by one 
     listModel.remove(listRange[i] - nbOfRemovedItems); 
     ++nbOfRemovedItems; 
     i++; 
    } 
}