Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Evento mouseclick jspinfield

Holaa, estoy haciendo un programa y he podido comprobar que al intentar ejecutar una acción con el evento mouseclick de un jspinfield para que funcione tengo que pulsar sobre el borde ya que su pulso dentro en el área de texto no lo reconoce, ¿alguna idea?
Gracias!

noviembre 21, 2013 | Registered Commentercarlota89

Por si ayuda, el programa lo estoy haciendo con Netbeans

noviembre 21, 2013 | Registered Commentercarlota89

JSpinField es una extensión de JPanel.
¿Qué clase de evento de ratón quieres procesar?

noviembre 21, 2013 | Registered Commenterchoces

El evento de click del ratón sobre él, osea, que al pulsar sobre el jspinfield haga lo que yo quiero

noviembre 21, 2013 | Registered Commentercarlota89

JSpinField es un JPanel, que usa internamente un JTextField y un JSpinner.

No es posible que al pulsar con el ratón "sobre" uno de estos dos componentes internos, puedas recibir eventos de ratón de ellos, porque no están implementados.

Únicamente siguen disponibles los de la clase JPanel que extiende; pero como ya has comprobado, solo se disparan en los bordes, porque el resto del espacio lo ocupan los componentes internos.

¿Para qué necesitas esos eventos de ratón, o qué es lo que quieres obtener?

noviembre 21, 2013 | Registered Commenterchoces

Estoy haciendo una aplicación para funcionar en monitores táctiles y quiero que al pulsar sobre el jspinfield se abra automáticamente un jdialog que tengo creado para que el usuario seleccione una cantidad.

noviembre 21, 2013 | Registered Commentercarlota89

JSpinField es un componente creado y utilizado por la librería JCalendar, como ya sabrás, que se usa para introducir un valor en un JTextField interno mediante un JSpinner interno.

No alcanzo a entender qué relación tiene con lo que intentas.
Si lo que quieres es que al pulsar sobre la pantalla se abra un JDialog, ¿Por qué no usas un JButton?.

noviembre 21, 2013 | Registered Commenterchoces

Tengo un jspinfield para introducir un valor numérico pero la aplicación la utilizo en modo normal y modo táctil pero el táctil no siempre se hace con dedos finos por lo que cambiar los valores numéricos es más complicado por lo que quiero desplegar un jdialog para introducir el número y al cerrarse que se ponga ese valor como texto en el jspinfield

noviembre 21, 2013 | Registered Commentercarlota89

Como el JTextField es interno, no veo la manera de añadirle un Mouse Listener, a menos que modifiques el código fuente de JSpinField.

noviembre 21, 2013 | Registered Commenterchoces

Muchas gracias por la respuesta, buscaré a ver cómo puedo hacerlo entonces ya que no sé cómo se hace dicha modificación.
Un saludo y gracias de nuevo.

noviembre 22, 2013 | Registered Commentercarlota89

Es más sencillo de lo que parece.

1.- Añade el método siguiente a la clase JSpinField:

public void addFieldMouseListener(MouseListener mouseListener) {
textField.addMouseListener(mouseListener);
}

2.- Sigue un Test completo, que puedes probar, y que muestra cómo se usa:

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/**
<p>
@author Administrator
*/
public class TestSpinField extends javax.swing.JFrame {

/** Creates new form TestSpinField */
public TestSpinField() {
initComponents();
((JSpinField) jPanelSpinField).addFieldMouseListener(new FieldMouseAdapterImpl());

}

/** This method is called from within the constructor to
initialize the form.
WARNING: Do NOT modify this code. The content of this method is
always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

jPanelSpinField = new JSpinField();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(new java.awt.FlowLayout());
getContentPane().add(jPanelSpinField);

pack();
}// </editor-fold>

/**
@param args the command line arguments
*/
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new TestSpinField().setVisible(true);
}
});
}

// Variables declaration - do not modify
private javax.swing.JPanel jPanelSpinField;
// End of variables declaration

private static class FieldMouseAdapterImpl extends MouseAdapter {

@Override
public void mouseClicked(MouseEvent e) {
System.out.println("ratón pulsado");
}
}
}

noviembre 22, 2013 | Registered Commenterchoces

Muchas gracias, lo intentaré a ver qué tal, miraré a ver cómo puedo agregar el método a una clase ya existente y después ya pruebo esto que me has comentado porque parece ser una buena solución ;-)

noviembre 22, 2013 | Registered Commentercarlota89

Porque si creo una clase que herede de jspinfield luego éstos hay que colocarlos manualmente sobre el jdialog pero el problema es que ya los tengo puestos ahí

noviembre 22, 2013 | Registered Commentercarlota89

El problema es que ese JTextField es una propiedad interna de JSpinField, por lo que no es accesible por las clases heredadas.
Cuando no se dispone del código fuente, la única opción es acceder a esa propiedad mediante reflexión; pero como JCalendar es de código abierto, lo más sencillo es crear un fork y hacer lo que sea necesario ;)

noviembre 22, 2013 | Registered Commenterchoces