Guida di MouseListener Java

Sto cercando di scrivere un programma in Java Swing che emetta una griglia 10 x 10 di rettangoli geometrici pieni di colors randoms. Tuttavia, quando l’utente fa clic su uno dei rettangoli all’interno della finestra di visualizzazione, il rettangolo deve ridisegnare () e passare a un altro colore.

Finora ho eseguito il programma rudimentale, ma non riesco a capire come implementare un mouseListener su di esso per fare in modo che il colore dei rettangoli cambi quando un utente fa clic all’interno. A questo punto, i rettangoli si ridisegnano solo quando la finestra di visualizzazione viene espansa e ridotta a icona. Qualsiasi consiglio / aiuto sarebbe molto apprezzato! Grazie!

Ecco cosa ho finora …

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(); } } 

    Qualsiasi Component può avere un MouseListener . JLabel è bello per un rettangolo colorato, purché sia ​​opaco.

    Addendum: Avendo consigliato MouseAdapter altrove, dovrei menzionare che un’istanza è sufficiente.

    Addendum: questo aggiornamento aggiunge il listener del mouse nel costruttore ColorLabel .

    Immagine 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(); } }); } } 

    Invece di avere un JPanel cui disegni la tua griglia di colors, che ne dici di avere una griglia di pulsanti. Esegui l’override del meccanismo di disegno per il pulsante in modo che esegua il rendering solo in base al colore corrente. Quindi hai funzionalità integrate per ascoltare i clic che si verificano in una sezione specifica della tua griglia.

    Questo è quello che mi è venuto in mente. Nota: sto ancora studiando Java in università, quindi questo potrebbe non essere il modo esatto per farlo, ma ha funzionato quando l’ho fatto.

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

    Questa è la prima parte, la seconda parte è quella di avere questi metodi nel codice.

     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) { } 

    Quindi, in base a ciò che desideri, (ovvero, il mouse ha fatto clic o premuto), digita:

     repaint(); 

    Spero che questo abbia aiutato.

    Supponendo di disporre di una matrice di colors 2D, è ansible utilizzare semplicemente xey che il mouselistener fornisce quando si fa clic per calcolare gli indici di quel rettangolo. Basta dividere xey per la dimensione del rettangolo usando la divisione intera. Dopo aver cambiato il colore, usa repaint () per mostrarlo.