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()); } } }
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.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.