28. april 2005 - 10:22Der 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()); } } ... });
Manuelle og semi-automatiske strategier for identitetsstyring virker - lige indtil nogen beder om dokumentation. For at undgå denne fare har DKTV taget kontrol over sin identitets- og adgangsstrategi.
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.
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); } }
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...
Argh! Jeg troede sådan set jeg havde fået lukket. Det har jeg åbentbart glemt. Det fungerede perfekt :)
Tak for hjælpen!
Synes godt om
Ny brugerNybegynder
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.