1

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

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

这是一个屏幕截图:

在此处输入图像描述

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

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

代码(为调用我的 JPanel '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);}
          }
        }
       }
     }



}
4

2 回答 2

2

为 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);
}
于 2013-07-09T14:46:12.663 回答
1

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

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

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

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

  • 顺便说一句,与 相同JPanel,但JToggleButton最简单,没有任何添加Listener,此外,任何代码行,因为这Colors两个可能的状态JToggleButton可以直接UIManager定义

于 2013-07-09T15:09:03.130 回答