如何知道某人是否在特定面板中点击了?

时间:2014-01-11 18:39:17

标签: java jframe jpanel mouse panels

所以这是我的问题。我有一个8 * 8的面板,都是白色的。然后,当单击其中一个时,它应该变为随机颜色。我现在唯一的问题是我不知道如何查看用户是否在特定面板中单击了鼠标。这是我到目前为止的代码(之后我将实现随机元素) `

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

`

2 个答案:

答案 0 :(得分:1)

您必须为每个可点击对象添加一个侦听器。这是一个有效的例子:

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

    }
}

答案 1 :(得分:0)

您必须将MouseListener添加到其中一个面板。只有一个面板会对点击事件做出反应。在侦听器中将源转换为JPanel并更改颜色。