我正在尝试(目前)创建一个 25 个方格宽、向下 12 个方格的网格,并使它们在单击时在 2 种颜色之间切换(默认情况下所有方 block 都是蓝色的,单击其中一个会将其变为红色。另一个单击会将其再次变回蓝色)
我已经很长时间没有做任何 Swing 的东西了,这将是我的 Android 应用程序的一个非常非常基础的关卡设计工具。它“有点”有效,但由于某种原因,鼠标位置似乎有点“偏离”。
这是截图:
您可以看到鼠标指针,是我点击的地方,红色方 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/