/** Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle or the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/
packageGUI.components;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;/*ListDemo.java requires no other files.*/
public class ListDemo extendsJPanelimplementsListSelectionListener {privateJList list;privateDefaultListModel listModel;private static final String hireString = "Hire";private static final String fireString = "Fire";privateJButton fireButton;privateJTextField employeeName;publicListDemo() {super(newBorderLayout());
listModel= newDefaultListModel();
listModel.addElement("Jane Doe");
listModel.addElement("John Smith");
listModel.addElement("Kathy Green");//Create the list and put it in a scroll pane.
list = newJList(listModel);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setSelectedIndex(0);
list.addListSelectionListener(this);
list.setVisibleRowCount(5);
JScrollPane listScrollPane= newJScrollPane(list);
JButton hireButton= newJButton(hireString);
HireListener hireListener= newHireListener(hireButton);
hireButton.setActionCommand(hireString);
hireButton.addActionListener(hireListener);
hireButton.setEnabled(false);
fireButton= newJButton(fireString);
fireButton.setActionCommand(fireString);
fireButton.addActionListener(newFireListener());
employeeName= new JTextField(10);
employeeName.addActionListener(hireListener);
employeeName.getDocument().addDocumentListener(hireListener);
String name=listModel.getElementAt(
list.getSelectedIndex()).toString();//Create a panel that uses BoxLayout.
JPanel buttonPane = newJPanel();
buttonPane.setLayout(newBoxLayout(buttonPane,
BoxLayout.LINE_AXIS));
buttonPane.add(fireButton);
buttonPane.add(Box.createHorizontalStrut(5));
buttonPane.add(newJSeparator(SwingConstants.VERTICAL));
buttonPane.add(Box.createHorizontalStrut(5));
buttonPane.add(employeeName);
buttonPane.add(hireButton);
buttonPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
add(listScrollPane, BorderLayout.CENTER);
add(buttonPane, BorderLayout.SOUTH);
}class FireListener implementsActionListener {public voidactionPerformed(ActionEvent e) {//This method can be called only if//there's a valid selection//so go ahead and remove whatever's selected.
int index =list.getSelectedIndex();
listModel.remove(index);int size =listModel.getSize();if (size == 0) { //Nobody's left, disable firing.
fireButton.setEnabled(false);
}else { //Select an index.
if (index ==listModel.getSize()) {//removed item in last position
index--;
}
list.setSelectedIndex(index);
list.ensureIndexIsVisible(index);
}
}
}//This listener is shared by the text field and the hire button.
class HireListener implementsActionListener, DocumentListener {private boolean alreadyEnabled = false;privateJButton button;publicHireListener(JButton button) {this.button =button;
}//Required by ActionListener.
public voidactionPerformed(ActionEvent e) {
String name=employeeName.getText();//User didn't type in a unique name...
if (name.equals("") ||alreadyInList(name)) {
Toolkit.getDefaultToolkit().beep();
employeeName.requestFocusInWindow();
employeeName.selectAll();return;
}int index = list.getSelectedIndex(); //get selected index
if (index == -1) { //no selection, so insert at beginning
index = 0;
}else { //add after the selected item
index++;
}
listModel.insertElementAt(employeeName.getText(), index);//If we just wanted to add to the end, we'd do this://listModel.addElement(employeeName.getText());//Reset the text field.
employeeName.requestFocusInWindow();
employeeName.setText("");//Select the new item and make it visible.
list.setSelectedIndex(index);
list.ensureIndexIsVisible(index);
}//This method tests for string equality. You could certainly//get more sophisticated about the algorithm. For example,//you might want to ignore white space and capitalization.
protected booleanalreadyInList(String name) {returnlistModel.contains(name);
}//Required by DocumentListener.
public voidinsertUpdate(DocumentEvent e) {
enableButton();
}//Required by DocumentListener.
public voidremoveUpdate(DocumentEvent e) {
handleEmptyTextField(e);
}//Required by DocumentListener.
public voidchangedUpdate(DocumentEvent e) {if (!handleEmptyTextField(e)) {
enableButton();
}
}private voidenableButton() {if (!alreadyEnabled) {
button.setEnabled(true);
}
}private booleanhandleEmptyTextField(DocumentEvent e) {if (e.getDocument().getLength() <= 0) {
button.setEnabled(false);
alreadyEnabled= false;return true;
}return false;
}
}//This method is required by ListSelectionListener.
public voidvalueChanged(ListSelectionEvent e) {if (e.getValueIsAdjusting() == false) {if (list.getSelectedIndex() == -1) {//No selection, disable fire button.
fireButton.setEnabled(false);
}else{//Selection, enable the fire button.
fireButton.setEnabled(true);
}
}
}/*** Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.*/
private static voidcreateAndShowGUI() {//Create and set up the window.
JFrame frame = new JFrame("ListDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//Create and set up the content pane.
JComponent newContentPane = newListDemo();
newContentPane.setOpaque(false); //content panes must be opaque
frame.setContentPane(newContentPane);//Display the window.
frame.pack();
frame.setVisible(true);
}public static voidmain(String[] args) {//Schedule a job for the event-dispatching thread://creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(newRunnable() {public voidrun() {
createAndShowGUI();
}
});
}
}