Avatar billede martinhrj Nybegynder
28. april 2005 - 10:22 Der er 6 kommentarer og
1 løsning

Vælge i en liste med højreklik

Jeg har følgende kode:

list.addMouseListener(new MouseListener(){
    public void mouseClicked(MouseEvent e){
        if(e.getButton() == MouseEvent.BUTTON3){
            //Her vil jeg gerne have valgt den komponent i listen som musen er over
            popup.show(e.getComponent(), e.getX(), e.getY());
        }
    }
...
});

Kan det lade sig gøre?
Avatar billede mikkelbm Nybegynder
28. april 2005 - 16:16 #1
http://java.sun.com/docs/books/tutorial/uiswing/components/menu.html#popup

Og så er det vel bare at kalde getSelectedValue() på din liste. (Hvis det er en JList)
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JList.html#getSelectedValue()

Spørg endelig hvis du er i tvivl...
Avatar billede martinhrj Nybegynder
28. april 2005 - 16:31 #2
Ok. Måske har jeg bare misforstået noget... men jeg syntes nu ikke det er svar på mit spørgsmål. Så jeg prøver lige igen :)

Jeg har en JList (i koden = list). Denne list har jeg tilføjet en MouseListener. Jeg har så valgt, at når man højreklikker skal den vise en popup. Det gør koden i mit første indlæg. Og det virker fint.

Mit problem er så: Når jeg højreklikker vises popup'en, men det element i listen som jeg højreklikker på bliver ikke valgt. Derfor udføres de ting som kan aktiveres via popup-menuen, på det element som var valgt FØR jeg højreklikkede. Jeg vil gerne have det element valgt, som jeg har musen over, når jeg højreklikker... FØR popup'en vises.

I dit første link, skrives der følgende:
"The exact gesture that should bring up a popup menu varies by look and feel. In Microsoft Windows, the user by convention brings up a popup menu by releasing the right mouse button while the cursor is over a component that is popup-enabled. In the Java look and feel, the customary trigger is either pressing the right mouse button (for a popup that goes away when the button is released) or clicking it (for a popup that stays up).In a future release, a new mechanism for automatically triggering popup menus in the appropriate way for the look and feel might be added; see bug #4634626."

Men det siger jo bare hvordan standarderne er... ikke hvordan man implementerer sådan en standard. jeg vil gerne bruge Windows-standard-look'n'feel.

Og fint nok at kalde getSelectedValue() på listen. Men det hjælper jo ikke, når det er det forkerte element der er valgt.

Gav det bedre mening?
Avatar billede mikkelbm Nybegynder
28. april 2005 - 21:23 #3
Ja, det gav mere mening :)

Med udgangspunkt i suns eget eksempel har jeg bikset følgende sammen:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Popup extends JFrame implements ActionListener
{
    private JList list = new JList(new DefaultListModel());
    JPopupMenu popup;
   
    public Popup()
    {
        this.setSize(300, 300);
        this.getContentPane().add(list, BorderLayout.CENTER);

        popup = new JPopupMenu();
        JMenuItem menuItem = new JMenuItem("A popup menu item");
        menuItem.addActionListener(this);
        popup.add(menuItem);
        menuItem = new JMenuItem("Another popup menu item");
        menuItem.addActionListener(this);
        popup.add(menuItem);
   
        //Add listener to components that can bring up popup menus.
        MouseListener popupListener = new PopupListener();
        list.addMouseListener(popupListener);
       
        for (int i = 0; i<10; i++)
        {
            ((DefaultListModel)list.getModel()).addElement("Test " + i);
        }
    }
   
    public void actionPerformed (ActionEvent e)
    {
        System.out.println (list.getSelectedValue());
    }
   
    private class PopupListener extends MouseAdapter
    {
        public void mousePressed(MouseEvent e)
        {
            maybeShowPopup(e);
        }
   
        public void mouseReleased(MouseEvent e)
        {
            maybeShowPopup(e);
        }
   
        private void maybeShowPopup(MouseEvent e)
        {
            if (e.isPopupTrigger())
            {
                int index = list.locationToIndex(e.getPoint());
                if (index >= 0)
                    list.setSelectedIndex(index);
                popup.show(e.getComponent(),  e.getX(), e.getY());
            }
        }
    }
   
    public static void main (String[] args)
    {
        new Popup().setVisible(true);
    }
}


Og det burde gøre som du gerne vil.
Avatar billede martinhrj Nybegynder
28. april 2005 - 22:41 #4
Arh! Så nærmer vi os :)

Jeg kan ikke lige teste det nu, men det ser ud til, at svaret på mit sp. er:
int index = list.locationToIndex(e.getPoint());
if (index >= 0)
    list.setSelectedIndex(index);

Jeg vender tilbage i morgen, når jeg har fået det testet...

På forhånd tak!
Avatar billede mikkelbm Nybegynder
02. maj 2005 - 23:27 #5
Hjalp det?
Avatar billede mikkelbm Nybegynder
14. maj 2005 - 20:08 #6
Lukketid?
Avatar billede martinhrj Nybegynder
14. maj 2005 - 20:24 #7
Argh! Jeg troede sådan set jeg havde fået lukket. Det har jeg åbentbart glemt. Det fungerede perfekt :)

Tak for hjælpen!
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