que - MouseListener Ayuda Java
mousemoved java (4)
Estoy intentando escribir un programa en Java Swing que da como resultado una cuadrícula de 10 x 10 de rectángulos geométricos llenos de colores de randoms. Sin embargo, cuando el usuario hace clic en uno de los rectángulos dentro de la ventana de visualización, el rectángulo debe repintarse () y cambiar a otro color.
Hasta ahora tengo el programa rudimentario ejecutándose, pero no puedo encontrar la manera de implementar un mouseListener para que el color de los rectángulos cambie cuando un usuario hace clic adentro. En este punto, los rectángulos 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();
}
}
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.
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
.
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://.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();
}
});
}
}
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.