java - 简单的可点击 Swing 'grid' 鼠标事件似乎不准确

标签 java swing grid jpanel mouselistener

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

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

这是截图:

enter image description here

您可以看到鼠标指针,是我点击的地方,红色方 block 是改变颜色的那个(x 位置也关闭,但没有 'y' 偏移那么多)。

为什么会这样?帮助将不胜感激。

代码(对于调用我的 JPanels 'myFrames' 造成的混淆表示歉意;-))

public class GUI extends JFrame implements MouseListener{

JFrame myFrame = new JFrame();
JLabel myPanels[];

    public GUI(){

        super("Grid");
        setSize(1000,400);
        setResizable(false);
        setLayout(new GridLayout(12,25));
        addMouseListener(this);

        myPanels = new JLabel[300];

        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));
        }
//Add all the squares (JLabels)
        for (int x = 0;x<myPanels.length;x++)
        add(myPanels[x]);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    //iterate through all JPanels to determine clicked one  
        for (int x = 0;x<myPanels.length;x++){
        if (e.getX()>myPanels[x].getX()&&e.getX()<(myPanels[x].getX()+myPanels[x].getWidth()))

        {

            if(e.getY()>myPanels[x].getY()&&e.getY()<(myPanels[x].getY()+myPanels[x].getHeight())){
        //Toggle colours    
        if (myPanels[x].getBackground()==Color.blue)
        myPanels[x].setBackground(Color.red);

        else {myPanels[x].setBackground(Color.blue);}
          }
        }
       }
     }



}

最佳答案

为 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
    }

并将监听器更改为

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

关于java - 简单的可点击 Swing 'grid' 鼠标事件似乎不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17551236/

相关文章:

grid - 重新排序小型设备中的列 Bootstrap 4

java - BigQuery 上传 csv 文件的时间戳错误

java - java中Thread.sleep()背后的逻辑是什么

java - 是否有替代方法来创建 Junit 测试结果报告而不是 ant 的 Junitreport 任务

java - java应用程序中的全屏模式

java - JTable中的并发问题

javascript - 在 ExtJS 中突出显示/选择网格行

java - 为什么 i = i + i 给我 0?

java - Swing 和 Java EE 服务器

css - Bootstrap v4 中 $container-max-width 和 $grid-breakpoint 之间有关系吗?