2011-01-31 3 views
8

Sto setacciando internet per questa risposta. Ho una JList semplice con gli oggetti al suo interno. Quando faccio clic con il pulsante destro del mouse, voglio che venga visualizzato un menu che dice "Usa, rilascia, annulla" o qualcosa di simile. TUTTAVIA, sono perplesso.JList Menu visualizzato con il tasto destro del mouse (Usa, rilascia, cancella)

Il codice seguente produrrà una JList semplice con alcuni elementi all'interno. Ho provato ad aggiungere un clic destro nel codice ma non funziona. Aiuto?

Ecco quello che ho finora:

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) 
    { 
    } 

} 

risposta

5

Non so cosa vuoi dire. Ecco un codice che sembra funzionare come specificato, ma oltre a eliminare qualsiasi numero di istruzioni ridondanti o buggy, è più o meno quello che hai postato.

/* 
<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) 
    { 
    } 
    */ 
} 

uscita

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

Mi dispiace per tutte le mie assurdità. È proprio come mi è stato insegnato. (classe liceo) – nn2

+0

Si prega di [accettare la risposta] (http://meta.stackexchange.com/a/5235/155831) se ha aiutato a risolvere il problema. –

4

Uno degli errori tipici possono essere di chiamare JPopupMenu.setVisible(true) e si aspettano che succeda qualcosa. Questo componente ha bisogno di un metodo diverso per farlo apparire. Riscrivere il vostro ascoltatore mouse lungo le linee:

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); 
      } 
     } 
    }); 

Guadagnare Esempio breve, aggiungo un elemento può essere aggiunto solo, ma sicuramente più. Il metodo show che uso richiede anche di specificare dove sul componente dovrebbe apparire il menu. La posizione può essere ottenuta dalla lista stessa come si vede in questo esempio.

+0

non [a se risposta] (http://stackoverflow.com/a/7427779/714968) di @kleopatra, le logiche sono le stesse, JOptionPane deve essere ritardato in invokeLater (non importante) – mKorbel

+0

No, poiché il metodo wrapper invokeLater è solo richiesto quando si chiama un metodo su oggetto Swing da un thread non swing. Nel nostro caso addActionListener sarà già chiamato nel thread Swing. – h22

+4

Questo codice genera un'eccezione quando si tenta di visualizzare un menu sull'ultimo elemento nell'elenco. listbox.getSelectedIndex() + 1 in quel caso si riferisce a un elemento di lista inesistente. – Clyde

1

In base alla precedente alla risposta, il codice seguente seleziona immediatamente l'elemento (con il tasto destro del mouse) e visualizza il pop-up accanto al clic del mouse.

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);    
     } 
    } 
}); 

C'è una sezione commentata che mostra un possibile modo di rimuovere l'elemento; presuppone l'esistenza di un ArrayList (chiamato array_list) che contiene una copia degli elementi sullo JList. Ha utilizzato il metodo to_array per aggiornare lo JList. Ci dovrebbe essere un modo più efficiente, ma se la tua lista è breve, dovrebbe essere sufficiente.