Swing JFC Java

import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class ListInput extends JPanel implements ListSelectionListener,
    ActionListener {
  protected JLabel label;
  protected JTextField textfield;
  protected JList list;
  protected JScrollPane scrollPane;
  public ListInput(String[] data, String title) {
    setLayout(null);
    setBorder(new EmptyBorder(5, 5, 5, 5));
    label = new ListInputLabel(title, JLabel.LEFT);
    add(label);
    textfield = new ListInputText();
    textfield.addActionListener(this);
    label.setLabelFor(textfield); // NEW
    add(textfield);
    list = new ListInputList(data);
    list.setVisibleRowCount(4);
    list.addListSelectionListener(this);
    scrollPane = new JScrollPane(list);
    add(scrollPane);
  }
  public ListInput(String title, int numCols) {
    setLayout(null);
    setBorder(new EmptyBorder(5, 5, 5, 5));
    label = new ListInputLabel(title, JLabel.LEFT);
    add(label);
    textfield = new ListInputText(numCols);
    textfield.addActionListener(this);
    label.setLabelFor(textfield); // NEW
    add(textfield);
    list = new ListInputList();
    list.setVisibleRowCount(4);
    list.addListSelectionListener(this);
    scrollPane = new JScrollPane(list);
    add(scrollPane);
  }
  public void setToolTipText(String text) {
    super.setToolTipText(text);
    label.setToolTipText(text);
    textfield.setToolTipText(text);
    list.setToolTipText(text);
  }
  public void setDisplayedMnemonic(char ch) {
    label.setDisplayedMnemonic(ch);
  }
  public void setSelected(String sel) {
    list.setSelectedValue(sel, true);
    textfield.setText(sel);
  }
  public String getSelected() {
    return textfield.getText();
  }
  public void setSelectedInt(int value) {
    setSelected(Integer.toString(value));
  }
  public int getSelectedInt() {
    try {
      return Integer.parseInt(getSelected());
    } catch (NumberFormatException ex) {
      return -1;
    }
  }
  public void valueChanged(ListSelectionEvent e) {
    Object obj = list.getSelectedValue();
    if (obj != null)
      textfield.setText(obj.toString());
  }
  public void actionPerformed(ActionEvent e) {
    ListModel model = list.getModel();
    String key = textfield.getText().toLowerCase();
    for (int i = 0; i < model.getSize(); i++) {
      String data = (String) model.getElementAt(i);
      if (data.toLowerCase().startsWith(key)) {
        list.setSelectedValue(data, true);
        break;
      }
    }
  }
  public void addListSelectionListener(ListSelectionListener lst) {
    list.addListSelectionListener(lst);
  }
  public Dimension getPreferredSize() {
    Insets ins = getInsets();
    Dimension labelSize = label.getPreferredSize();
    Dimension textfieldSize = textfield.getPreferredSize();
    Dimension scrollPaneSize = scroll.getPreferredSize();
    int w = Math.max(Math.max(labelSize.width, textfieldSize.width),
        scrollPaneSize.width);
    int h = labelSize.height + textfieldSize.height + scrollPaneSize.height;
    return new Dimension(w + ins.left + ins.right, h + ins.top + ins.bottom);
  }
  public Dimension getMaximumSize() {
    return getPreferredSize();
  }
  public Dimension getMinimumSize() {
    return getPreferredSize();
  }
  public void doLayout() {
    Insets ins = getInsets();
    Dimension size = getSize();
    int x = ins.left;
    int y = ins.top;
    int w = size.width - ins.left - ins.right;
    int h = size.height - ins.top - ins.bottom;
    Dimension labelSize = label.getPreferredSize();
    label.setBounds(x, y, w, labelSize.height);
    y += labelSize.height;
    Dimension textfieldSize = textfield.getPreferredSize();
    textfield.setBounds(x, y, w, textfieldSize.height);
    y += textfieldSize.height;
    scrollPane.setBounds(x, y, w, h - y);
  }
  public void appendResultSet(ResultSet results, int index,
      boolean toTitleCase) {
    textfield.setText("");
    DefaultListModel model = new DefaultListModel();
    try {
      while (results.next()) {
        String str = results.getString(index);
        if (toTitleCase) {
          str = Character.toUpperCase(str.charAt(0))
              + str.substring(1);
        }
        model.addElement(str);
      }
    } catch (SQLException ex) {
      System.err.println("appendResultSet: " + ex.toString());
    }
    list.setModel(model);
    if (model.getSize() > 0)
      list.setSelectedIndex(0);
  }
  class ListInputLabel extends JLabel {
    public ListInputLabel(String text, int alignment) {
      super(text, alignment);
    }
    public AccessibleContext getAccessibleContext() {
      return ListInput.this.getAccessibleContext();
    }
  }
  class ListInputText extends JTextField {
    public ListInputText() {
    }
    public ListInputText(int numCols) {
      super(numCols);
    }
    public AccessibleContext getAccessibleContext() {
      return ListInput.this.getAccessibleContext();
    }
  }
  class ListInputList extends JList {
    public ListInputList() {
    }
    public ListInputList(String[] data) {
      super(data);
    }
    public AccessibleContext getAccessibleContext() {
      return ListInput.this.getAccessibleContext();
    }
  }
  // Accessibility Support
  public AccessibleContext getAccessibleContext() {
    if (accessibleContext == null)
      accessibleContext = new AccessibleOpenList();
    return accessibleContext;
  }
  protected class AccessibleOpenList extends AccessibleJComponent {
    public String getAccessibleName() {
      System.out.println("getAccessibleName: " + accessibleName);
      if (accessibleName != null)
        return accessibleName;
      return label.getText();
    }
    public AccessibleRole getAccessibleRole() {
      return AccessibleRole.LIST;
    }
  }
  public static void main(String[] a) {
    String[] fontNames = new String[] { "Roman", "Times Roman" };
    ListInput lstFontName = new ListInput(fontNames, "Name:");
    lstFontName.setDisplayedMnemonic('n');
    lstFontName.setToolTipText("Font name");
    JFrame f = new JFrame();
    f.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
    f.getContentPane().add(lstFontName);
    f.pack();
    f.setSize(new Dimension(300, 200));
    f.show();
  }
}