MouseListener Ayuda Java

Estoy intentando escribir un progtwig en Java Swing que da como resultado una cuadrícula de 10 x 10 de rectangularjs geométricos llenos de colores de randoms. Sin embargo, cuando el usuario hace clic en uno de los rectangularjs dentro de la ventana de visualización, el rectángulo debe repintarse () y cambiar a otro color.

Hasta ahora tengo el progtwig rudimentario ejecutándose, pero no puedo encontrar la manera de implementar un mouseListener para que el color de los rectangularjs cambie cuando un usuario hace clic dentro. En este punto, los rectangularjs solo se vuelven a pintar cuando la ventana de visualización se expande y minimiza. ¡Cualquier consejo / ayuda sería muy apreciado! ¡Gracias!

Esto es lo que tengo hasta ahora …

import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.awt.geom.*; public class ColorGrid extends JPanel { int w, x, y, z; Color c = new Color((int)(Math.random() * 0xFFFFFF)); public void paint(Graphics g){ Graphics2D g2 = (Graphics2D) g; setLayout(new GridLayout(10,10)); int w = x = y = z = 0; for(int i=0;i<100;i++){ Color c = new Color((int)(Math.random() * 0xFFFFFF)); w+=10; x+=10; y+=50; z+=15; g2.drawRect(w+10,x+30,y,z); g2.drawRect(w+10,x+30,y,z); g2.fillRect(w+10,x+30,y,z); g2.setPaint(c); } } public static void main(String[] args) { JFrame f= new JFrame(); f.setTitle("ColorGrid Display Window"); f.setSize(200,200); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); Container contentPane = f.getContentPane(); contentPane.add(new ColorGrid()); f.show(); } } 

Cualquier Component puede tener un MouseListener . JLabel es agradable para un rectángulo de color, siempre que lo haga opaco.

Adición: Habiendo recomendado MouseAdapter otro lugar, debería mencionar que una instancia es suficiente.

Adición: esta actualización agrega el oyente del mouse en el constructor ColorLabel .

Imagen ColorLabel

 import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Random; import javax.swing.JFrame; import javax.swing.JLabel; /** @see http://stackoverflow.com/questions/5136859 */ public class ColorLabel extends JLabel { private static final int N = 10; private static final Random random = new Random(); private static final MouseAdapter listener = new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { ColorLabel label = (ColorLabel) e.getSource(); label.setBackground(new Color(random.nextInt())); } }; public ColorLabel() { this.setOpaque(true); this.setBackground(new Color(random.nextInt())); this.setPreferredSize(new Dimension(32, 32)); this.addMouseListener(listener); } private void displayGrid() { JFrame f = new JFrame("ColorGrid"); f.setLayout(new GridLayout(N, N)); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); for (int i = 0; i < N * N; i++) { final ColorLabel label = new ColorLabel(); f.add(label); } f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new ColorLabel().displayGrid(); } }); } } 

En lugar de tener un JPanel que JPanel tu cuadrícula de colores, ¿qué tal si tienes una grilla de botones? Sobreescribes el mecanismo de dibujo del botón para que se muestre como su color actual. Luego tiene la funcionalidad incorporada para escuchar los clics que se producen en una sección específica de su grilla.

Esto es lo que se me ocurrió. Nota: Todavía estoy estudiando Java en la Universidad, por lo que esta podría no ser la forma exacta de hacerlo, pero funcionó cuando lo hice.

 public class ColorGrid extends JPanel implements MouseListener { this.addMouseListener(this); addMouseListener(this); 

Esa es la primera parte, la segunda parte es tener estos métodos en tu código.

 public void mouseClicked(MouseEvent arg0) { } public void mouseEntered(MouseEvent arg0) { } public void mouseExited(MouseEvent arg0) { } public void mousePressed(MouseEvent arg0) { } public void mouseReleased(MouseEvent arg0) { } 

Luego, dependiendo de lo que desee, (es decir, haga clic o presione el mouse), simplemente escriba:

 repaint(); 

Espero que esto haya ayudado.

Suponiendo que tiene una matriz de colores en 2d, puede simplemente usar la xey que el monitorizador le da cuando hace clic para calcular los índices de ese rectángulo. Simplemente divida la xey por el tamaño del rectángulo usando la división de enteros. Después de cambiar el color, usa repintado () para mostrarlo.