Search code examples
javajframejpanelmousepanels

How do I know if someone clicks in a specific panel?


so this is my problem. I have an 8*8 grid of panels, all white. Then, when one of them is clicked, it's supposed to change to a random color. The only problem I have right now is that I don't know how to see if the user clicked their mouse in a specific panel. Here is the code I have so far (I'm going to implement the random element afterwards) `

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class GridOfPanels extends JPanel{
    int x, y;
    public GridOfPanels(){
        JPanel content = new JPanel(new GridLayout(8,8));
        for(int i = 0; i < 64; i++){
            JPanel panel = new JPanel();
            panel.setBackground(Color.white);
            content.add(panel);
        }
        this.add(content);
    }
    public GridOfPanels(Color backColor){
        setBackground(backColor);
        addMouseListener(new PanelListener());
        x = 200;
        y = 200;
    }
    private class PanelListener extends MouseAdapter{
        public void mousePressed(MouseEvent e){
            x = e.getX();
            y = e.getY();
            repaint();
        }
    }
    public static void main(String[] args){
        JFrame theGUI = new JFrame();
        theGUI.setTitle("Grid");
        theGUI.setVisible(true);
        theGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        theGUI.setSize(400,400);
        Rectangle z = new Rectangle(x, y, 50, 50);
    }
}

`


Solution

  • You have to add a listener to each clickable object. Here is a working example:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class TestFrame extends JFrame{
    
        public TestFrame(int size){
            JPanel content = new JPanel(new GridLayout(size, size));
            JPanel[] panel = new JPanel[size * size];
            PanelListener listener = new PanelListener();
    
            for(int i = 0; i < panel.length; i++){
                panel[i] = new JPanel();
                panel[i].setBackground(Color.white);
                panel[i].addMouseListener(listener);
                content.add(panel[i]);
            }
    
            this.add(content);
        }
    
        // MouseListener offers the method mouseClicked(MouseEvent e)
        private class PanelListener implements MouseListener {
    
            @Override
            public void mouseClicked(MouseEvent event) {
                        /* source is the object that got clicked
                         * 
                         * If the source is actually a JPanel, 
                         * then will the object be parsed to JPanel 
                         * since we need the setBackground() method
                         */
                Object source = event.getSource();
                if(source instanceof JPanel){
                    JPanel panelPressed = (JPanel) source;
                    panelPressed.setBackground(Color.blue);
                }
            }
    
            @Override
            public void mouseEntered(MouseEvent arg0) {}
    
            @Override
            public void mouseExited(MouseEvent arg0) {}
    
            @Override
            public void mousePressed(MouseEvent arg0) {}
    
            @Override
            public void mouseReleased(MouseEvent arg0) {}
    
        }
    
        public static void main(String[] args){
            TestFrame theGUI = new TestFrame(8);
            theGUI.setTitle("Grid");
            theGUI.setVisible(true);
            theGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            theGUI.setSize(400,400);
    
        }
    }