Avatar billede trp79 Nybegynder
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
Avatar billede riversen Nybegynder
28. februar 2003 - 20:37 #1
1: ja...returneringen fra objektets tostring bliver vist i comboboxen

2: getselectedindex, getselecteditem
Avatar billede magoo20000 Nybegynder
28. februar 2003 - 20:58 #2
Avatar billede magoo20000 Nybegynder
28. februar 2003 - 21:02 #3
Avatar billede =maddog= Nybegynder
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.
Avatar billede trp79 Nybegynder
01. marts 2003 - 08:18 #5
Maddag:
Hvis du lige smider et svar, så kan i dele pointene :o)

Alle:
Tak for svarene :o)
Avatar billede trp79 Nybegynder
01. marts 2003 - 08:19 #6
Maddag = Maddog selvfølgelig!
Avatar billede =maddog= Nybegynder
01. marts 2003 - 08:19 #7
det gør jeg gerne.
Avatar billede magoo20000 Nybegynder
01. marts 2003 - 11:13 #8
Takker
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester