// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html
/* (swing1.1) */
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.event.ListDataEvent;
import javax.swing.plaf.basic.BasicComboPopup;
import javax.swing.plaf.basic.ComboPopup;
import javax.swing.plaf.metal.MetalComboBoxUI;
import javax.swing.table.DefaultTableModel;
/**
* @version 1.0 3/06/99
*/
public class SmallCellComboExample extends JFrame {
public SmallCellComboExample() {
super("SmallCell Combo Example");
DefaultTableModel dm = new DefaultTableModel(4, 10) {
public void setValueAt(Object obj, int row, int col) {
if (obj != null) {
String str;
if (obj instanceof String) {
str = ((String) obj).substring(0, 2);
} else {
str = obj.toString();
}
super.setValueAt(str, row, col);
}
}
};
JTable table = new JTable(dm);
String[] str = { "010 - To Time", "020 - Vacation", "030 - Feel Bad" };
SteppedComboBox combo = new SteppedComboBox(str) {
public void contentsChanged(ListDataEvent e) {
selectedItemReminder = null;
super.contentsChanged(e);
}
};
Dimension d = combo.getPreferredSize();
combo.setPopupWidth(d.width);
DefaultCellEditor editor = new DefaultCellEditor(combo);
table.setDefaultEditor(Object.class, editor);
JScrollPane scroll = new JScrollPane(table);
getContentPane().add(scroll, BorderLayout.CENTER);
}
public static void main(String[] args) {
SmallCellComboExample frame = new SmallCellComboExample();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setSize(300, 120);
frame.setVisible(true);
}
}
/**
* @version 1.0 12/12/98
*/
class SteppedComboBoxUI extends MetalComboBoxUI {
protected ComboPopup createPopup() {
BasicComboPopup popup = new BasicComboPopup(comboBox) {
public void show() {
Dimension popupSize = ((SteppedComboBox) comboBox)
.getPopupSize();
popupSize
.setSize(popupSize.width,
getPopupHeightForRowCount(comboBox
.getMaximumRowCount()));
Rectangle popupBounds = computePopupBounds(0, comboBox
.getBounds().height, popupSize.width, popupSize.height);
scroller.setMaximumSize(popupBounds.getSize());
scroller.setPreferredSize(popupBounds.getSize());
scroller.setMinimumSize(popupBounds.getSize());
list.invalidate();
int selectedIndex = comboBox.getSelectedIndex();
if (selectedIndex == -1) {
list.clearSelection();
} else {
list.setSelectedIndex(selectedIndex);
}
list.ensureIndexIsVisible(list.getSelectedIndex());
setLightWeightPopupEnabled(comboBox.isLightWeightPopupEnabled());
show(comboBox, popupBounds.x, popupBounds.y);
}
};
popup.getAccessibleContext().setAccessibleParent(comboBox);
return popup;
}
}
class SteppedComboBox extends JComboBox {
protected int popupWidth;
public SteppedComboBox(ComboBoxModel aModel) {
super(aModel);
setUI(new SteppedComboBoxUI());
popupWidth = 0;
}
public SteppedComboBox(final Object[] items) {
super(items);
setUI(new SteppedComboBoxUI());
popupWidth = 0;
}
public SteppedComboBox(Vector items) {
super(items);
setUI(new SteppedComboBoxUI());
popupWidth = 0;
}
public void setPopupWidth(int width) {
popupWidth = width;
}
public Dimension getPopupSize() {
Dimension size = getSize();
if (popupWidth < 1)
popupWidth = size.width;
return new Dimension(popupWidth, size.height);
}
}