Listor, comboboxar och spinners

JList

Liksom allt annat i Swing är både listor, comboboxar och spinners mycket flexibla. Listexemplet ListTest.java demonstrerar de detaljer som tas upp här.

En lista innehåller en property, visibleRowCount, som anger hur många rader som maximalt får visas samtidigt. I exemplet sätts den till tre med raden theList.setVisibleRowCount(3).

I motsats till AWT finns det inget inbyggt stöd för att skrolla listan, utan den måste placeras i en JScrollPane  på tex detta vis: JScrollPane scroll = new JScrollPane(theList ).

Metoden getModel() returnerar ett objekt av typen ListModel som bara innehåller metoder för att läsa listans element. Vill vi kunna ändra listans innehåll måste vi definiera en egen modell av typen DefaultListModel och tilldela den till listan, se raderna
model = new DefaultListModel();
theList = new JList(model );
Sedan kan vi ändra innehållet med hjälp av metoder i vår egen modell. Detta görs till exempel på raden model.addElement(text.getText()) .

ListSelectionModel, som används för att hantera markerade element, stöder tre olika markeringsmoder. Detta anges med property selectionMode. Konstanterna MULTIPLE_INTERVAL_SELECTION, SINGLE_INTERVAL_SELECTION och SINGLE_SELECTION anger att listan hanterar flera intervall, ett intervall eller endast ett valt element. Default är "ett intervall".

Listan är inte begränsad till att visa endast text. Det går att visa i princip vilka komponenter som helst, men då måste man skriva en egen ListCellRenderer, vilken ska returnera ett objekt som kan rita upp ett element i listan.

Händelser

JList skickar ListSelectionEvent när markeringen ändras. ListModel skickar ListDataEvent när listans innehåll ändras.

JComboBox

Här är ett exempel på en JComboBox, ComboBoxTest.java, vilket (naturligtvis) bara visar en bråkdel av funktionaliteten hos JComboBox.

En JComboBox representeras internt av ett textfält med en popup JList, varför dess beteende är snarlikt JList. En combobox kan dock bara ha ett markerat element åt gången och skickar därför inget ListSelectionEvent.

I JComboBox anges antal synliga rader av en property vid namn maximumRowCount. Om det behövs sköts skrollningen om automatiskt, utan någon scroll pane.

Det går också bra att ändra listans innehåll utan att ta omvägen via modellen. JComboBox innehåller till exempel metoderna addItem() och removeAllItems().

På samma sätt som en JList kan även en JComboBox visa i stort sett vilka komponenter som helst.

händelser

DefaultComboBoxModel skickar ListDataEvent när listans innehåll ändrats. JComboBox skickar ActionEvent och ItemEvent när markeringen ändrats. Det markerade elementet visas automatiskt i comboboxens textfält.

JSpinner

En spinner ser ut ungefär som en combobox med en bara en rad. Den är ett utmärkt alternativ när användaren ska välja ett värde. JSpinner är kraftfull därför att den har flera lättandvända modeller. I SpinnerExample.java demonstreras spinners med de tre olika modellerna
För att få reda på användarens val registreras en ChangeListener och i dess metod StateChanged anropas spinnerns metod getValue().