2011-01-31 8 views
8

Przeszukuję internet w poszukiwaniu tej odpowiedzi. Mam proste JList z przedmiotów w nim. Kiedy klikam prawym przyciskiem myszy, chcę wyskakujące menu z napisem "Użyj, upuść, anuluj" lub coś podobnego. JEDNAK, jestem zakłopotany.JList Kliknięcie prawym przyciskiem myszy pokazuje menu (użyj, upuść, anuluj)

Poniższy kod wygeneruje prosty plik JList z kilkoma elementami wewnątrz. Próbowałem dodać kod prawym przyciskiem myszy, ale nie działa. Wsparcie?

Oto co mam do tej pory:

import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseAdapter; 
import javax.swing.*; 



public class inv extends JApplet implements MouseListener { 

    JList listbox; 



    public void init() 
    { 


    String listData[] = { "Item 1","Item 2","Item 3","Item 4" }; 
listbox = new JList(listData); 

    listbox.addMouseListener(new MouseAdapter() 
    { 
     public void mousePressed(MouseEvent e) 
     { 
      if (SwingUtilities.isRightMouseButton(e)) 
      { 
       listbox.setSelectedIndex(getRow(e.getPoint())); 
      } 
     } 
    }); 

    listbox.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 


     add(listbox); 
        listbox.setVisible(true); 

      listbox.setFocusable(false); 

    } 



    private int getRow(Point point) 
    { 
     return listbox.locationToIndex(point); 
} 

     public void mousePressed(MouseEvent e) { 
     } 

     public void mouseReleased(MouseEvent e) { 
     } 

     public void mouseEntered(MouseEvent e) { 
     } 

     public void mouseExited(MouseEvent e) { 
     } 

     public void mouseClicked(MouseEvent e) { 
     } 


    public void stop() 
    { 
    } 

    public void paint(Graphics g) 
    { 
    } 

} 

Odpowiedz

5

Nie wiem co masz na myśli. Oto kod, który wydaje się działać tak, jak określasz, ale oprócz wyrzucenia dowolnej liczby zbędnych lub błędnych stwierdzeń, jest to prawie to, co napisałeś.

/* 
<applet code='inv' width='200' height='200'> 
</applet> 
*/ 
import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseAdapter; 
import javax.swing.*; 

public class inv extends JApplet { //implements MouseListener { 

    JList listbox; 

    public void init() 
    { 


    String listData[] = { "Item 1","Item 2","Item 3","Item 4" }; 
listbox = new JList(listData); 

    listbox.addMouseListener(new MouseAdapter() 
    { 
     public void mousePressed(MouseEvent e) 
     { 
      System.out.println(e); 
      if (SwingUtilities.isRightMouseButton(e)) 
      { 
       System.out.println("Row: " + getRow(e.getPoint())); 
       listbox.setSelectedIndex(getRow(e.getPoint())); 
      } 
     } 
    }); 

    listbox.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     add(listbox); 
        // unnecessary 
        //listbox.setVisible(true); 

      listbox.setFocusable(false); 
    } 



    private int getRow(Point point) 
    { 
     return listbox.locationToIndex(point); 
} 

/** Why implement MouseListener, while adding a MouseAdapter? 
Do you have ANY idea what your doing? 

     public void mousePressed(MouseEvent e) { 
     } 

     public void mouseReleased(MouseEvent e) { 
     } 

     public void mouseEntered(MouseEvent e) { 
     } 

     public void mouseExited(MouseEvent e) { 
     } 

     public void mouseClicked(MouseEvent e) { 
     } 
*/ 

    /** What is this nonsense supposed to achieve? 
    Don't override empty methods with empty implementations! 
    public void stop() 
    { 
    } 
    */ 

    /** What is this nonsense supposed to achieve? 
    public void paint(Graphics g) 
    { 
    } 
    */ 
} 

Wyjście

java.awt.event.MouseEvent[MOUSE_PRESSED,(31,22),absolute(39,72),button=3,modifiers=Meta+Button3,extModifiers=Button3,clickCount=1] on javax.swing.JList[,0,0,200x200,alignmentX=0.0,alignmentY=0.0,border=,flags=50331944,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],selectionForeground=sun.swing.PrintColorUIResource[r=51,g=51,b=51],visibleRowCount=8,layoutOrientation=0] 
Row: 1 
java.awt.event.MouseEvent[MOUSE_PRESSED,(29,39),absolute(37,89),button=3,modifiers=Meta+Button3,extModifiers=Button3,clickCount=1] on javax.swing.JList[,0,0,200x200,alignmentX=0.0,alignmentY=0.0,border=,flags=50331944,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],selectionForeground=sun.swing.PrintColorUIResource[r=51,g=51,b=51],visibleRowCount=8,layoutOrientation=0] 
Row: 2 
java.awt.event.MouseEvent[MOUSE_PRESSED,(36,65),absolute(468,192),button=3,modifiers=Meta+Button3,extModifiers=Button3,clickCount=1] on javax.swing.JList[,0,0,200x200,alignmentX=0.0,alignmentY=0.0,border=,flags=50331944,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],selectionForeground=sun.swing.PrintColorUIResource[r=51,g=51,b=51],visibleRowCount=8,layoutOrientation=0] 
Row: 3 
java.awt.event.MouseEvent[MOUSE_PRESSED,(45,11),absolute(477,138),button=3,modifiers=Meta+Button3,extModifiers=Button3,clickCount=1] on javax.swing.JList[,0,0,200x200,alignmentX=0.0,alignmentY=0.0,border=,flags=50331944,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],selectionForeground=sun.swing.PrintColorUIResource[r=51,g=51,b=51],visibleRowCount=8,layoutOrientation=0] 
Row: 0 

Tool completed successfully 
+0

Przepraszam za wszystkie moje bzdury. Tak właśnie mnie uczono. (klasa liceum) – nn2

+0

Proszę [zaakceptuj odpowiedź] (http://meta.stackexchange.com/a/5235/155831), jeśli pomogło rozwiązać problem. –

4

Jednym z typowych błędów może zadzwonić JPopupMenu.setVisible(true) i oczekują coś się wydarzy. Ten komponent wymaga innej metody, aby go przywołać. Przepisz swój słuchacza myszy wzdłuż linii:

listbox.addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
      if (e.isPopupTrigger()) { 
       JPopupMenu menu = new JPopupMenu(); 
       JMenuItem item = new JMenuItem("Say hello"); 
       item.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         JOptionPane.showMessageDialog(inv.this, "Hello " 
           + listbox.getSelectedValue()); 
        } 
       }); 
       menu.add(item); 
       menu.show(inv.this, 5, listbox.getCellBounds(
         listbox.getSelectedIndex() + 1, 
         listbox.getSelectedIndex() + 1).y); 
      } 
     } 
    }); 

Aby przykład krótkie, dodam tylko jedną pozycję, ale na pewno więcej można dodać. Metoda show, której używam, również wymaga określenia, gdzie na komponencie powinno pojawić się menu. Lokalizację można uzyskać z samej listy, jak widać w tym przykładzie.

+0

not [to se answer] (http://stackoverflow.com/a/7427779/714968) autorstwa @kleopatra, logika jest taka sama, JOptionPane powinno być opóźnione w invokeLater (nie ważne) – mKorbel

+0

Nie, ponieważ metoda invokeLater wrapper jest tylko wymagane podczas wywoływania metody na obiekcie Swing z wątku innego niż Swing. W naszym przypadku addActionListener będzie już wywoływany w wątku Swing. – h22

+4

Ten kod zgłasza wyjątek podczas próby wyświetlenia menu na ostatniej pozycji na liście. listbox.getSelectedIndex() + 1 w tym przypadku odnosi się do nieistniejącego elementu listy. – Clyde

1

Opierając się na poprzednich odpowiedziach, poniższy kod: natychmiast wybiera pozycję (po kliknięciu prawym przyciskiem myszy) i wyświetla wyskakujące okienko obok kliknięcia myszy.

listbox.addMouseListener(new MouseAdapter() { 
    public void mousePressed(MouseEvent e) { 
     if (SwingUtilities.isRightMouseButton(e)) {  
      listbox.setSelectedIndex(listbox.locationToIndex(e.getPoint())); 

      JPopupMenu menu = new JPopupMenu(); 
      JMenuItem itemRemove = new JMenuItem("Remove"); 
      itemRemove.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 

        // This could probably be improved, but assuming you also keep the values in an ArrayList, you can remove the element like this 
        //array_list.remove(listbox.getSelectedValue()); 
        //listbox.setListData((String[]) array_list.toArray(new String[array_list.size()])); 

        System.out.println("Remove the element in position " + listbox.getSelectedValue()); 

       } 
      }); 
      menu.add(itemRemove); 
      menu.show(listbox, e.getPoint().x, e.getPoint().y);    
     } 
    } 
}); 

Istnieje sekcja z komentarzami, która pokazuje możliwy sposób usunięcia przedmiotu; zakłada istnienie ArrayList (zwanej array_list), która zawiera kopię elementów na JList. Użyto metody to_array w celu odświeżenia JList. Powinien istnieć bardziej skuteczny sposób, ale jeśli twoja lista jest krótka, powinna wystarczyć.