Bevezetés
Az alábbi példában listaelemeket helyezhetünk át egyik listából a másikba. A listaelemeket
csak a felületen lévő gombokkal lehet áthelyezni, és csak akkor ha van kijelölve elem. A bal oldali listában
több elemet is ki lehet jelölni, a jobb oldaliban azonban csak egyet.
Objektumok létrehozása, inicializállása
A listákat a java.awt.List és a javax.swing.JList osztály implemetálja. A példában az előbbi kerül bemutatásra, de
a JList osztály is hasonlóan viselkedik azzal a különbséggel, hogy nem String -eket, hanem Object -eket tárol.
Listák esetében a konstruktorban is meg lehet adni, hogy hány elem legyen látható, valamint, hogy
engedélyezett-e több elem kijelölése. A példában mindkettő előfordul.
A lista elemeit egyenként írjuk be. Csak az első (bal oldali) listába töltjük fel az adatokat, a
második (jobb oldali) lista egyelőre üres marad. Oda majd akkor kerülnek elemek, ha kijelölünk néhány elemet a bal oldali listában és megnyomjuk az Add >> gombot.
private List list1, list2;
...
list1 = new List( 5, true ); // 5 items are visible and
// multiple selection is enabled
list2 = new List( 5, false );
list1.add( "Egg" );
list1.add( "Bread" );
list1.add( "Cheese" );
list1.add( "Wine" );
list1.add( "Coke" );
list1.add( "Toast" );
list1.add( "Pepper" );
list1.add( "Tomato" );
list1.add( "Potato" );
list1.add( "Mustard" );
// now list2 is empty
A gombokat kezdetben inaktívra állítjuk. Erre azért van szükség, mert csak akkor nyomhatjuk meg az
Add >> gombot, ha a bal oldali listában van kijelölve elem, és a << Remove gomb csak
akkor aktív, ha a jobb oldali lista valamelyik eleme ki van jelölve.
addButton.setEnabled( false );
removeButton.setEnabled( false );
A listák elemei a List objektumok esetében a remove(String) ,
remove(int) és removeAll() függvényekkel törölhetők.
Eseménykezelés
A java.awt.List osztályhoz ItemListener és ActionListener eseményfigyelő is adható.
A két esemény között az a különbség listák esetében, hogy ItemEvent akkor jön létre, amikor egy elemet kiválasztunk a listából,
ActionEvent pedig akkor jön létre, amikor egy elemre kétszer kattintunk. Esetünkben elég lesz listáknál az ItemEvent -eket
lekezelni. A lista eseményeit az ItemListener void itemStateChanged(ItemEvent) metódusban kezeljük le. Az ActionListener
void actionPerformed(ActionEvent) metódusa a két gomb miatt van implementálva.
Ha a bal oldali listában kijelölünk egy elemet, akkor minden kijelölés megszűnik a jobb oldali listában és az Add >> gomb aktív lesz (amíg van kijelölve elem).
Ha a jobb oldali listában jelölünk ki elemet, akkor a bal oldalon szűnik meg minden kijelölés, és a << Remove gomb lesz aktív.
// list event handling
public void itemStateChanged( ItemEvent e ) {
if ( e.getSource().equals( list1 ) ) {
// deselect all items in list2
for ( int i = 0; i < list2.getItemCount(); i++ ) {
list2.deselect( i );
}
String[] selectedItems = list1.getSelectedItems();
if ( selectedItems.length > 1 ) {
label.setText( "Would you add these items to the list?" );
} else if ( selectedItems.length == 1 ) {
label.setText( "Would you add this item to the list?" );
}
if ( selectedItems.length != 0 ) {
this.addButton.setEnabled( true );
} else {
this.addButton.setEnabled( false );
}
this.removeButton.setEnabled( false );
}
if ( e.getSource().equals( list2 ) ) {
// deselect all items in list1
for ( int i = 0; i < list1.getItemCount(); i++ ) {
list1.deselect( i );
}
String selectedItem = list2.getSelectedItem();
if ( selectedItem != null ) {
label.setText( "Would you remove this item from the list?" );
}
if ( selectedItem != null ) {
this.removeButton.setEnabled( true );
} else {
this.removeButton.setEnabled( false );
}
this.addButton.setEnabled( false );
}
}
// button event handling
public void actionPerformed( ActionEvent e ) {
if ( e.getSource().equals( addButton ) ) {
String[] selectedItems = list1.getSelectedItems();
for ( int i = selectedItems.length - 1; i >= 0; i-- ) {
list1.remove( selectedItems[i] );
list2.add( selectedItems[i] );
}
addButton.setEnabled( false );
}
if ( e.getSource().equals( removeButton ) ) {
String selectedItem = list2.getSelectedItem(); //only one can be selected
list2.remove( selectedItem );
list1.add( selectedItem );
removeButton.setEnabled( false );
}
}
|