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()); } } ... });
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
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.