2012-10-05 32 views
5

tengo:Java Swing - Cómo manejar los genéricos en ActionListener

class CustomerActionListener implements ActionListener 
{ 
    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
    JComboBox cb = (JComboBox)event.getSource(); 
    .. do something 
    } 
} 

que hace que la siguiente advertencia del compilador en JDK7:

JComboBox es un tipo de prima. Las referencias al tipo genérico JComboBox se deben parametrizar

He tratado de parametrizar a tal que:

JComboBox<String> cb = (JComboBox<String>)event.getSource(); 

Pero esto todavía deja la siguiente advertencia del compilador:

seguridad Tipo: Desactivada fundido de Object a JComboBox

Por lo tanto, no estoy seguro de cómo eliminar las advertencias del compilador ...

+0

¿Una comprobación de verificación ayuda? Incluso si sabes que siempre obtendrás un JComboBox al final. – Rex

+0

No creo que "codifique" una solución para resolver el problema. Sin embargo, puedes suprimir las advertencias. Eche un vistazo a http://stackoverflow.com/questions/593996/how-to-suppress-java-compiler-warnings-for-specific-functions. El problema es que el compilador mira el 'ActionEvent.getSource' y dice" Tengo un Objeto y, aunque en teoría, puedes lanzarme, lo que intentas lanzarme podría no funcionar " – MadProgrammer

+0

Entiendo que puedes suprimir el advertencia, pero eso es menos que ideal para mí. Si lo hice con todas las advertencias del compilador, bueno, digamos que no sería bueno. Siempre es mejor averiguar por qué y resolverlo adecuadamente si es posible. –

Respuesta

4

Aprecio este enfoque. Evita cualquier tipo de difusión y es fácil de leer.

He mejorado mi respuesta, ahora No te da Advertencias del compilador. El tipo de JComboBox ahora está configurado en Cadena. Para obtener el artículo seleccionado, debe pasar por el ComboBoxModel.

class CustomerActionListener implements ActionListener 
{ 
    private JComboBox<String> comboBox; 
    public CustomerActionListener(JComboBox<String> comboBox){ 
    this.comboBox = comboBox; 
    } 
    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
    // Just use the comboBox 
    ComboBoxModel<String> model = comboBox.getModel(); 
    int index = comboBox.getSelectedIndex(); 
    String choosen = model.getElementAt(index); 
    System.out.println("Hey you choose "+choosen); 
    } 
} 
+1

Y cómo esto ayudará a deshacerse de * JComboBox es un tipo sin procesar. Las referencias al tipo genérico JComboBox se deben parametrizar * advertencia. Su código tiene exactamente el mismo problema – Robin

+1

Intente compilar ese código con JDK7 -> ¡Todavía tiene la advertencia del compilador! Tu respuesta no resuelve el problema tal como está. –

+0

Gracias Robin y Guillaume. Hizo algunos cambios Primero olvidé configurar el tipo en JComboBox. Luego pensé que un JComboBox tipeado podría devolver un Typed Result mecanografiado más fácilmente al simplemente llamar a getSelectedItem(). Pero no puede. Ahora debería funcionar bien. No recibo ningún compilerwarnings. – daniel

0

tratar de comprobar esto:

A very useful link form StackOverflow

En pocas palabras, compilador Java no saben qué objeto es el que usted está tratando de lanzar, por lo que no le gusta hacer el reparto sin una palabra, debe avisarte que tal vez estás cometiendo un error (pero SÍ sabes qué clase de clase es el objeto que estás lanzando, así que no te molesta) Añade un @SuppressWarning ("desmarcado")

+0

@stephane (escrito por Meriton). Por lo tanto, no es necesario agregar advertencia de supresión;) Puede escribir: Clase > c = ClientAction.class; Acción action = c.newInstance(); Esto elimina el lanzamiento y la advertencia, al precio de introducir un tipo no genérico, por lo que puede usar .class para obtener un objeto de Clase con suficiente tipeo. – Gianmarco

0

La única forma de salir aquí es agarrar una referencia escrito a su JComboBox:

O como esto

JComboBox<String> myStringCb = new JComboBox<String>(); 
... 
myStringCb.addActionListener(new CustomerActionListener(myStringCb); 

y con ustedes ActionListener:

class CustomerActionListener implements ActionListener { 

    private JComboBox<String> cb; 

    public CustomerActionListener(JComboBox<String> cb) { 
    this.cb = cb; 
    } 

    @Override 
    public void actionPerformed(ActionEvent event) { 
    if(event.getSource()==cb) { 
     // Here you can do something with the typed cb 
    } 
    } 
} 

O, Otra solución es usar un ActionListener anónimo con un final referencia:

final JComboBox<String> myStringCb = new JComboBox<String>(); 
myStringCb.addActionListener(new ActionListener(){ 

    public void actionPerformed(ActionEvent e) { 
     // Here you can refer directly to myStringCb 
    } 

}); 
+0

ehh ... eso es bastante contradictorio con la idea básica de una Acción (que es uno-a-muchos :-) – kleopatra

+0

@kleopatra Nada le impide hacer este uno-a-muchos. En este ejemplo, expuse el concepto básico y una relación de uno a uno. Pero como indicaste en otra publicación, el tipeo del elemento UI es algo sin sentido. No debería ir más allá del modelo. –

+1

_Nada le impide hacer esto de uno a muchos._ Nada excepto ... mantener una lista de objetivos? No creo que sea una opción viable, al final, al menos estamos de acuerdo en el tipo de inutilidad de los genéricos en el ámbito de la vista :-) – kleopatra