2011-01-31 26 views
8

He estado buscando en Internet esta respuesta. Tengo una lista J simple con elementos dentro de ella. Cuando hago clic derecho, quiero que aparezca un menú emergente que dice "Usar, soltar, cancelar" o algo de esa naturaleza. SIN EMBARGO, estoy perplejo.ListaJaz Haga clic con el botón derecho en el menú (Usar, soltar, cancelar)

El siguiente código producirá una lista J simple con algunos elementos dentro. Intenté agregar un clic derecho en el código pero no funciona. ¿Ayuda?

Esto es lo que tengo hasta ahora:

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

} 

Respuesta

5

No sé a qué se refiere. Aquí hay un código que parece funcionar como usted especifica, pero aparte de eliminar cualquier cantidad de declaraciones redundantes o erróneas, es más o menos lo que ha publicado.

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

salida

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

Lo siento por todas mis tonterías. Es solo como me enseñaron. (clase de secundaria) – nn2

+0

Por favor [acepte la respuesta] (http://meta.stackexchange.com/a/5235/155831) si esto ayudó a resolver el problema. –

4

Uno de los errores típicos pueden llamar JPopupMenu.setVisible(true) y esperar que algo suceda. Este componente necesita un método diferente para mostrarlo. Vuelva a escribir su detector de ratón a lo largo de las líneas:

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

Para hacer corta ejemplo, añado un elemento sólo a poco más se puede añadir. El método de muestra que uso también requiere especificar dónde debería aparecer el menú en el componente. La ubicación se puede obtener de la lista como se ve en este ejemplo.

+0

no [a la respuesta] (http://stackoverflow.com/a/7427779/714968) por @kleopatra, la lógica es la misma, JOptionPane debe retrasarse en invokeLater (no es importante) – mKorbel

+0

No, como el método de envoltura invokeLater es solo requerido cuando se llama a un método en un objeto Swing desde un hilo que no es Swing. En nuestro caso, addActionListener ya se llamará en el hilo Swing. – h22

+4

Este código arroja una excepción cuando se intenta abrir un menú en el último elemento de la lista. listbox.getSelectedIndex() + 1 en ese caso se refiere a un elemento de lista inexistente. – Clyde

1

Basado en la respuesta anterior, el siguiente código sería Seleccione inmediatamente el elemento (haga clic con el botón derecho) y visualice la ventana emergente junto 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);    
     } 
    } 
}); 

Hay una sección comentada que muestra una posible forma de eliminar el elemento; asume la existencia de un ArrayList (llamado array_list) que contiene una copia de los elementos en el JList. Usó el método to_array para actualizar el JList. Debería haber una manera más eficiente, pero si su lista es corta, debería ser suficiente.

Cuestiones relacionadas