user3185730
user3185730

Reputation: 11

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

`

Upvotes: 0

Views: 3957

Answers (2)

ChopChop
ChopChop

Reputation: 140

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

    }
}

Upvotes: 1

kukido
kukido

Reputation: 10601

You have to add MouseListener to one of the panels. Only one panel will react to click event. In the listener cast the source to JPanel and change the color.

Upvotes: 0

Related Questions