28. februar 2003 - 20:35
Der er
5 kommentarer og
3 løsninger
Objekter i JCombobox
Hejsa,
1)kan man putte objekter i et JCombobox og bruge toString() til at bestemme hvilken variabel den skal vise?
2)Hvis overstående kan lade sig gøre, hvordan aflæser jeg når jeg trykker på en knap hvilket objekt der er valgt i comboboksen?
Jeg vil meget gerne have et kodeeksempel, da jeg overhovedet ingen erfaring har med combobokse.
mvh
Torben
01. marts 2003 - 01:25
#4
Denne klasse skulle virke
class AppletMenu extends JComboBox implements ActionListener {
private Object title;
private ActionMap am;
private Dimension size;
private int length;
public AppletMenu(Object title) {
// super constructor
super();
// init fields
this.title = title;
am = new ActionMap();
// call methods
setFont(new Font("SansSerif",Font.PLAIN,12)); // These two are
setBorder(BorderFactory.createEmptyBorder()); // somewhat LAF dep.
setRenderer(new AppletMenuRenderer());
addActionListener(this);
addItem(title);
validateSize(title);
}
public void addItem(Object item) {
super.addItem(item);
length++;
setMaximumRowCount(length);
}
public void add(Action a, Object label) {
if (a==null || am.get(label)!=null) return; // sanity check
removeActionListener(this); // Otherwise we will fire an event!
addItem(label);
am.put(label, a);
validateSize(label);
addActionListener(this); // Resume listening
}
public void add(Action a) {
add(a, a.getValue(Action.NAME));
}
public void addSeparator() {
Separator jc = new Separator();
jc.setSize(size.width-10,0);
addItem(jc);
}
public Dimension getMaximumSize() {
return size;
}
public Dimension getPreferredSize() {
return size;
}
public Dimension getMinimumSize() {
return size;
}
public void actionPerformed(ActionEvent ae) {
// relegate the ActionEvent to the corresponding Action
if (am.get(getSelectedItem())!=null)
am.get(getSelectedItem()).actionPerformed(ae);
setSelectedItem(title);
setMaximumRowCount(length);
}
private void validateSize(Object label) {
Dimension d;
int escape =(label.equals(title))?30:2;
if (label instanceof Component) {
// We have a component - use minimumsize
d = ((Component)label).getMinimumSize();
} else {
// We will use toString()
FontMetrics fm=getFontMetrics(getFont());
d = new Dimension(fm.stringWidth(label.toString())+escape,fm.getHeight());
}
if (size == null) size = d;
if (d.height>size.height) size.height=d.height;
if (d.width>size.width) size.width=d.width;
setMaximumSize(d);
}
/*
* INNER CLASS: The renderer. This will ensure Objects added will be shown
* as they should
*/
class AppletMenuRenderer extends JLabel implements ListCellRenderer {
public AppletMenuRenderer() {
setOpaque(true);
setHorizontalAlignment(LEFT);
setVerticalAlignment(CENTER);
}
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
// Empty header, and no hover for Separator objects.
if (index ==0) return new JLabel();
if (value instanceof AppletMenu.Separator) {
((JLabel)value).setHorizontalAlignment(CENTER);
return (JLabel)value;
}
Component retval;
if (value instanceof Component)
retval = (Component) value;
else {
setText(value.toString());
retval = this;
}
if (isSelected) {
retval.setBackground(list.getSelectionBackground());
retval.setForeground(list.getSelectionForeground());
} else {
retval.setBackground(list.getBackground());
retval.setForeground(list.getForeground());
}
return retval;
}
}
class Separator extends JLabel {
public Separator() {
super();
setBorder(BorderFactory.createEtchedBorder());
}
}
}
eksempel
AppletMenu editMenu = new AppletMenu("Edit");
editMenu.add(am.get(DefaultEditorKit.cutAction), "Cut");
editMenu.add(am.get(DefaultEditorKit.copyAction), "Copy");
editMenu.add(am.get(DefaultEditorKit.pasteAction), "Paste");
editMenu.addSeparator();
editMenu.add(new StyledEditorKit.ForegroundAction("Red", Color.red), "Red");
editMenu.add(new StyledEditorKit.ForegroundAction("Green", Color.green), "Green");
editMenu.add(new StyledEditorKit.ForegroundAction("Blue", Color.blue), "Blue");
editMenu.add(new StyledEditorKit.ForegroundAction("Black", Color.black), "Black");
du tilføjer med metoderne
add(Action)
add(Action, Object)
hvis der kun gives en Action anvendes Action.NAME feltet. Hvis der gives et Object, der arver fra Component vises dette. Ellers vises objektets toString().
Denne implementering viser en titel i stedet for det valgte punkt. Hvis du ønsker det anderledes skal du lige lave et par små ændringer.
Når et punkt vælges udføres punktets Action's actionPerformed metode.