JAVATM GUI TUTORIAL

Lista

JAVATM GUI Tutorial > Lista   |   Applet   Forráskód   Letöltések

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 ); } }

Forráskód

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class ListBoxExampleApplet extends JApplet implements ActionListener, ItemListener { private JPanel mainPanel; private JLabel label; private List list1, list2; private JButton addButton; private JButton removeButton; private JPanel buttonPanel; public void buildGui() { mainPanel = new JPanel(); mainPanel.setLayout( new BorderLayout() ); buttonPanel = new JPanel(); buttonPanel.setLayout( new GridLayout( 2, 1 ) ); addButton = new JButton( "Add >>" ); removeButton = new JButton( "<< Remove" ); label = new JLabel( "The selected item: " ); 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 list1.addItemListener( this ); list2.addItemListener( this ); addButton.addActionListener( this ); removeButton.addActionListener( this ); // setting the layout this.getContentPane().add( mainPanel ); mainPanel.add( list1, BorderLayout.WEST ); mainPanel.add( list2, BorderLayout.EAST ); mainPanel.add( buttonPanel, BorderLayout.CENTER ); mainPanel.add( label, BorderLayout.SOUTH ); buttonPanel.add( addButton ); buttonPanel.add( removeButton ); addButton.setEnabled( false ); removeButton.setEnabled( false ); } // 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 ); } } public void init() { buildGui(); repaint(); } }

Letöltés

Fordítás J2SDK 1.4 vagy magasabb verziójával.
# > javac ListBoxExampleApplet.java
Applet: ListBoxExampleApplet.java
Stand-alone változat: ListBoxExample.java



Vissza a lap tetjére