import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.ItemSelectable;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Enumeration;
import java.util.Vector;
public class ChoiceSample {
private MyChoice choice;
public ChoiceSample () throws Exception {
Frame frame = new Frame("Test");
frame.setBounds(100, 100, 300, 100);
frame.setLayout(new FlowLayout());
frame.addWindowListener(new WindowAdapter() {
public void windowClosing() {
System.exit(0);
}
});
choice = new MyChoice();
choice.add("ABC1234567890");
choice.add("DEF1234567890");
choice.add("GHI1234567890");
choice.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent event) {
MyChoice choice = (MyChoice)event.getSource();
System.out.println(choice.getSelectedItem());
}
});
frame.add(choice);
Button open = new Button("Open List");
open.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
choice.showPopup();
}
});
frame.add(open);
frame.setVisible(true);
}
class MyChoice extends Container implements ItemSelectable {
private TextField field;
private Button down;
private PopupMenu menu;
private Vector listeners;
public MyChoice() {
setLayout(new BorderLayout());
field = new TextField();
field.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.VK_DOWN
|| event.getKeyCode() == KeyEvent.VK_SPACE) {
showList();
}
}
});
field.setEditable(false);
down = new Button("▼");
down.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
showList();
}
});
add(field, BorderLayout.CENTER);
add(down, BorderLayout.EAST);
menu = new PopupMenu();
menu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
fireItemEvent(event.getActionCommand());
}
});
add(menu);
listeners = new Vector();
}
private void fireItemEvent(String selectedText) {
field.setText(selectedText);
ItemEvent event = new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED,
selectedText, ItemEvent.SELECTED);
Enumeration enu = listeners.elements();
while(enu.hasMoreElements()) {
ItemListener listener = (ItemListener)enu.nextElement();
listener.itemStateChanged(event);
}
}
private void showList() {
menu.show(this, 0, getHeight());
}
public void add(String txt) {
menu.add(new MenuItem(txt));
if (menu.getItemCount() == 1) {
field.setText(txt);
}
}
public void addItemListener(ItemListener l) {
listeners.addElement(l);
}
public Object[] getSelectedObjects() {
return new Object[] {field.getText()};
}
public String getSelectedItem() {
return field.getText();
}
public void removeItemListener(ItemListener l) {
listeners.removeElement(l);
}
public void showPopup() {
menu.show(this, 0, getHeight());
}
}
public static void main(String[] args) throws Exception {
new ChoiceSample();
}
}
|