JList tekent een lijst van elementen op het scherm. De lijst zelf zit niet 'in' de JList. Je kan hem globaal op 2 manieren elementen laten zien. Door hem een array met objecten te geven. Dan kan je er niks meer aan veranderen.
Of door een ListModel te gebruiken. Zoals de naam al zegt, is het een model voor een list, de JList. Dit model is een object dat de ListModel interface implementeerd. Iedereen kan dus een eigen ListModel maken waardoor je helemaal kan bepalen hoe de elementen eruit komen te zien.
offtopic:
Je ListModel zou dus ook objecten kunnen 'genereren'. Zo kan je bijvoorbeeld alle int's van 0 tot max_int kunnen laten zien in een JList
Maar omdat het omslachtig is om voor elk wissewasje een ListModel zelf te maken zijn er 2 makkelijkere oplossingen.
Je kan de DefaultListModel gebruiken. Deze heeft dezelfde methoden als de (oude) Vector (dus elementAt() enzo, dus niet de nieuwe List methodes (dat wordt later wel veranderd). Hiermee kan je tijdens het draaien van het programma elementen toevoegen aan de lijst. Dat doe je dus niet door de JList zelf aan te spreken, maar zijn model.
Of je extends AbstractListModel, die doet het meeste al voor je. Je moet alleen 2 methodes implementeren. (getElementAt, getSize)
In jou geval is het dus het makkelijkst om DefaultListModel te gebruiken. Persoonlijk maak ik mijn eigen model van AbstractListModel. Voordeel: je kan zelf bepalen wat voor interface je aan je programma presenteerd. Zo kan je een toevoeg methode schrijven die nieuwe elementen sorteerd op iets, of dubbele niet acepteerd. Je hebt veel meer controle dan een normale ArrayList, Vector of DefaultListModel.
Nu vraag je je af waarom je niet gewoon een ArrayList kan gebruiken als een ListModel. Nou, dat komt omdat een ListModel de JList moet vertellen wanneer er iets is veranderd aan het model. Als je zelf AbstractListModel gebruikt moet je dat zelf ook doen door de fireContentsChanged, fireIntervalAdded, fireIntervalRemoved aan te roepen als je het model veranderd.
Voorbeeldje:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| MijnListModel extends AbstractListModel{
private List<String> data = new ArrayList()<String>;
//ListModel interface
public Object getElementAt(int index){
return data.get(index);
}
//ListModel interface
public int getSize(){
return data.size();
}
//eigen interface naar het model
public void voegToe(String titel){
int pos = Collections.binarySearch(data, titel);
if(pos < 0){ // titel is nieuw als pos is kleiner dan 1
// -(pos-1) geeft de plek in de lijst aan waar hij zou moeten indien gesorteerd
pos = -(pos-1);
data.add(titel, pos);
fireIntervalAdded(this, pos, pos); //geef door aan JList dat het model veranderd is
}
// als hij er al in staat doen we niets
}
} |
Nu vergeet ik te vertellen hoe je hem gebruikt. Dat is eigenlijk heel makkelijk:
Java:
1
2
| MijnListModel titelLijst = new MijnListModel(); //maak nieuw model
JList titelLijst = new JList(titelLijst); |
Dan kan je nu ergens in een ActionListener die bij een knop of invoerveldje zit, of misschien een database, of elke zoveel seconden, of door een berekening, of at random of uit een bestand nieuwe titels halen/maken/ruiken.
Bijvoorbeeld uit een invoer veld:
Java:
1
2
| String titel = textInvoerVeld.getText();
titelModel.voegToe(titel); |
Nu wordt al door je model gezorgt dat de lijst gesorteerd blijft. Ook al gebruik je een ArrayList waarbij er 10 manieren om data toe te voegen is, je kan er alleen maar bij met voegToe(), dus je hoeft alleen met die methode rekening te houden om je data gesorteerd te houden.
[
Voor 16% gewijzigd door
Macros op 23-09-2004 00:53
. Reden: Wat meer uitleg erbij. ]