Java 简单的可点击摆动';网格';鼠标事件不';似乎不准确

Java 简单的可点击摆动';网格';鼠标事件不';似乎不准确,java,swing,grid,jpanel,mouselistener,Java,Swing,Grid,Jpanel,Mouselistener,我正在尝试(目前)创建一个由25个方格组成的网格,向下12个方格,并使它们在单击时在两种颜色之间切换(默认情况下,所有方格都是蓝色的,单击其中一个会将其变为红色。再次单击会将其变回蓝色) 我已经很长时间没有做任何Swing的东西了,这将是我的Android应用程序的一个非常基本的设计工具。它“有点”起作用,但出于某种原因,鼠标位置似乎有点“关闭” 这是一个屏幕截图: 你能看到的鼠标指针,就是我点击的地方,红色的方块就是改变颜色的那个(x位置也被关闭了,但没有“y”那么多) 为什么会这样?我们将

我正在尝试(目前)创建一个由25个方格组成的网格,向下12个方格,并使它们在单击时在两种颜色之间切换(默认情况下,所有方格都是蓝色的,单击其中一个会将其变为红色。再次单击会将其变回蓝色)

我已经很长时间没有做任何Swing的东西了,这将是我的Android应用程序的一个非常基本的设计工具。它“有点”起作用,但出于某种原因,鼠标位置似乎有点“关闭”

这是一个屏幕截图:

你能看到的鼠标指针,就是我点击的地方,红色的方块就是改变颜色的那个(x位置也被关闭了,但没有“y”那么多)

为什么会这样?我们将不胜感激

代码(对于将我的JPanel称为“myFrames”造成的混乱,我深表歉意;-)

公共类GUI扩展JFrame实现MouseListener{
JFrame myFrame=新的JFrame();
JLabel myPanels[];
公共图形用户界面(){
超级电网;
设置大小(1000400);
可设置大小(假);
setLayout(新网格布局(12,25));
addMouseListener(这个);
myPanels=新的JLabel[300];

对于(int x=0;x,为JFrame(即窗口)添加了单击侦听器,因此鼠标坐标相对于窗口的左上角,而不是网格的左上角

如果您想知道单击了哪个网格元素,只需将单击侦听器添加到每个网格面板而不是整个JFrame中可能会更容易

    for (int x = 0;x<myPanels.length;x++){

        myPanels[x]=new JLabel("");
        myPanels[x].setOpaque(true);
        myPanels[x].setBackground(Color.BLUE);
        myPanels[x].setBorder(BorderFactory.createLineBorder(Color.black));
        myPanels[x].addMouseListener(this); // <-- add same listener to each grid
    }
我正在尝试(现在)创建一个由25个正方形组成的网格,宽12 向下方格,单击时使其在2种颜色之间切换(全部 默认情况下,正方形为蓝色,单击其中一个会将其变为红色。 再次单击将使其再次变回蓝色)

  • 使用
    JToggleButton.setBackground(Color.Xxx)
    ,如果
    JToggleButton.isSelected()

  • 将最后选择的项添加到局部变量(字符串)

  • 上一点的所有坐标都基于,然后在容器中的
    JComponents
    内循环,并测试局部变量中的
    String
    是否包含,如果等于

  • 顺便说一句,与
    JPanel
    相同,但是使用
    JToggleButton
    最简单,无需添加任何
    Listener
    ,任何代码行,因为
    JToggleButton
    的两种可能状态的这两种
    颜色可以直接在
    UIManager
    中定义


谢谢@Samual-这确实是问题所在,可以解释为什么Y的偏移量大于X(因为标题栏)-我已经实现了您的解决方案,效果很好-干杯
    for (int x = 0;x<myPanels.length;x++){

        myPanels[x]=new JLabel("");
        myPanels[x].setOpaque(true);
        myPanels[x].setBackground(Color.BLUE);
        myPanels[x].setBorder(BorderFactory.createLineBorder(Color.black));
        myPanels[x].addMouseListener(this); // <-- add same listener to each grid
    }
@Override
public void mouseClicked(MouseEvent e) {
    JLabel clickedPanel = (JLabel) e.getSource();

    //Toggle colours    
    if (clickedPanel.getBackground()==Color.blue)
        clickedPanel.setBackground(Color.red);
    else 
        clickedPanel.setBackground(Color.blue);
}