Java - Contacto EXACTO entre el mouse y un JButton

 
Vista:
sin imagen de perfil
Val: 25
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Contacto EXACTO entre el mouse y un JButton

Publicado por Manuel Alejandro Aponte (13 intervenciones) el 18/01/2018 00:52:22
Buenos dias, en mi proyecto tengo un JButton, con una imagen y le quito los bordes y el relleno
1
2
3
4
boton1.setBorder(null);
boton1. setContentAreaFilled(false);
ImageIcon imagenboton1 = new ImageIcon("src/modo_prueba/arboll.png");
boton1.setIcon(imagenboton1);

La imagen tiene transparencias en algunas partes,pretendo que se desencadene una accion al pasar el mouse por encima de mi imagen, pero solo en las partes que tienen color, en las que son transparentes no.
El problema es que al hacer uso del metodo mouseEntered, este no identifica estas transparencias, solo reconoce el contexto rectangular de la imagen. quisiera entonces me dijeran como podria hacer para que se detecte el mouse encima de la parte con color, gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 190
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Contacto EXACTO entre el mouse y un JButton

Publicado por preguntas (70 intervenciones) el 18/01/2018 03:35:46
Puede que con canvas se pueda hacer.

También una manera de llegar al mismo fin y mas fácil, seria recrear esa imagen con paneles, labels o botones yo que se y asignarle el evento solo al componente o área que necesites.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 25
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Contacto EXACTO entre el mouse y un JButton

Publicado por manuel (13 intervenciones) el 18/01/2018 18:57:49
Me podrias dar una pista acerca de como podria utilizar el canvas para tal fin, o cuales son los metodos por los cuales lo podria lograr, aun me siento crudo en este tema , gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Contacto EXACTO entre el mouse y un JButton

Publicado por Tom (1831 intervenciones) el 18/01/2018 09:10:40
En un componente swing, el hecho de que "pintes" o no no influye en el área que ocupa (y por tanto en los eventos que recibe).
Hazlo "a mano". En mouseEntered comprueba la posición del evento y busca el pixel equivalente en tu imagen.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 25
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Contacto EXACTO entre el mouse y un JButton

Publicado por manuel (13 intervenciones) el 18/01/2018 19:05:05
Vale lo que entiendo seria que si tengo una figura con una forma "rara" y esta tuviese un solo color , podria comprobar el color de mi figura al hacer clic y asi efectuar la accion, sin embargo, como es una imagen tiene varios no se tonos, entonces que se haria en ese caso, no se si te interprete mal, gracias
PD: Aun asi, ha sido de enorme ayuda tu comentario, ya he podido tener un avance gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Contacto EXACTO entre el mouse y un JButton

Publicado por Tom (1831 intervenciones) el 18/01/2018 20:04:26
¿ No dices que la imagen tiene partes transparentes ? Pues si el pixel _no_ es transparente, activas lo que sea que quieras hacer.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 25
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Contacto EXACTO entre el mouse y un JButton

Publicado por manuel (13 intervenciones) el 19/01/2018 01:53:48
Ahh vale te entiendo mucho mejor, aun sin embargo intente plantear lo que me comentaste, pero en las partes en la que pulso clic "en la parte transparente" para que me de el valor RGB y el alpha , me toma es el valor del color de la lamina , asi la fuente sea el boton. Aqui dejo el codigo por si se puede ver mi fallo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class Temporal {
 
    public static void main(String[] args) {
        interfaz ventana = new interfaz();
    }
 
}
 
class interfaz extends JFrame
{
 
    public interfaz()
    {
 
        setVisible(true);
        setBounds(20,20,600,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("MI APLICACION");
        add(new lamina());
    }
}
 
class lamina extends JPanel
{
    Color micolor;
    lamina()
    {
        setLayout(null);
        JButton boton1 = new JButton();
        add(boton1);
        boton1.setBorderPainted(false);
        boton1.setContentAreaFilled(false);
        boton1.setBounds(0, 0, 400, 250);
        boton1.addMouseListener(new mouse());
 
 
        ImageIcon imagenboton1 = new ImageIcon("src/temporal/arboll.png");
        boton1.setIcon(imagenboton1);
 
    }
    class mouse extends MouseAdapter
    {
 
        @Override
        public void mousePressed(MouseEvent e)
        {
 
            try {
                micolor = new Robot().getPixelColor(e.getXOnScreen(), e.getYOnScreen());
                System.out.println("R: "+micolor.getRed()+" G: "+micolor.getGreen() + " B: " + micolor.getBlue()+ " A: "+ micolor.getAlpha());
            } catch (AWTException ex) {
                Logger.getLogger(lamina.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Contacto EXACTO entre el mouse y un JButton

Publicado por Tom (1831 intervenciones) el 19/01/2018 09:29:16
Exacto, por eso te decía que debes examinar la imagen, los pixels de la imagen.
Pero ya que tienes eso ... compara el colo que has obtenido con el color de fondo de lo que haya debajo ("la lamina"). Si es igual ... ya sabes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Contacto EXACTO entre el mouse y un JButton

Publicado por Tom (1831 intervenciones) el 19/01/2018 17:42:26
Bueno, pues parece bastante difícil de conseguir ya que JButton no nos da las coordenadas X e Y en las que dibuja el icono ...
Esto, hecho deprisa, funciona razonablemente bien:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
public class Test1 extends JFrame {
	/* */
	Test1() throws IOException {
		super("Test png button");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		createMain(getContentPane());
		pack();
	}
	/* */
	void createMain(Container p) throws IOException {
		ImageIcon test = new ImageIcon("/tmp/tbrn2c08.png");
 
		p.add(new MyButton(test));
	}
	/* */
	public static void main(String[] args) throws IOException {
		new Test1().setVisible(true);
	}
	/* */
	class MyButton extends JButton {
		BufferedImage ii;
		/* */
		MyButton(ImageIcon i) {
			super(i);
			ii = new BufferedImage(i.getIconWidth(), i.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
			ii.getGraphics().drawImage(i.getImage(), 0, 0, null);
			setOpaque(true);
			setContentAreaFilled(false);
			setBorderPainted(false);
			setFocusPainted(false);
 
			addMouseMotionListener(new MouseAdapter() {
				@Override
				public void mouseMoved(MouseEvent e) {
					if(testOpacityUnderPos(e.getX(), e.getY())) {
						// Do some effect
					} else {
						// undo effect
					}
				}
			});
			addMouseListener(new MouseAdapter() {
				@Override
				public void mouseClicked(MouseEvent e) {
					if(testOpacityUnderPos(e.getX(), e.getY())) {
						System.out.println("Image Clicked !");
					}
				}
			});
		}
		/* */
		private boolean testOpacityUnderPos(int x, int y) {
			Icon test = getIcon();
			int ix = (getWidth() - test.getIconWidth()) / 2;
			int iy = (getHeight() - test.getIconHeight()) / 2;
 
 
			if((x > ix) && (x < (ix + test.getIconWidth()))) {
				if((y > iy) && (y < (iy + test.getIconHeight()))) {
					int rgb = ii.getRGB(x - ix, y - iy);
					if((rgb & 0xff000000) != 0) {
						return true;
					}
				}
			}
			return false;
		}
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 25
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Contacto EXACTO entre el mouse y un JButton

Publicado por manuel (13 intervenciones) el 20/01/2018 00:07:37
Ohh, muchas gracias, por fin puedo entender mas esto ¡¡¡
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar